&НаКлиенте
Перем ВКакихФрагментахСсылки;

&НаКлиенте
Перем RegExpLocal;

&НаКлиенте
Перем НовоеНаименованиеПриКопировании;

&НаСервере
Перем RegExpLocal;
&НаСервереБезКонтекста
Функция ЗначениеВСтроку(Значение)

	Возврат ЗначениеВСтрокуВнутр(Значение);

КонецФункции

&НаСервереБезКонтекста
Функция ЗначениеИзСтроки(Значение)

	Возврат ЗначениеИзСтрокиВнутр(Значение);

КонецФункции



#Область ОбщиеМетоды	
//Перенесены из одноименного общего модуля

// Функция - Добавить значение в массив без повторений
//
// Параметры:
//  Массив	 - Массив - результирующий массив
//  Значение - Произвольное - добавляемое значение
//
&НаКлиентеНаСервереБезКонтекста
Функция ДобавитьВМассивБезПовторений(Массив, Значение)

	Элем = Массив.Найти(Значение);
	Если Элем = Неопределено Тогда
		Массив.Добавить(Значение);
		Возврат Массив.ВГраница();
	Иначе
		Возврат Элем;
	КонецЕсли;

КонецФункции


// Процедура - Добавить значение в список без повторений
//
// Параметры:
//  Список			 - СписокЗначений - результирующий список значений
//  Значение		 - Произвольное - добавляемое значение
//  Представление	 - Строка - строковое представление значения
//  Пометка			 - Булево - пометка
//  Картинка		 - Картинка - картинка
//
&НаКлиентеНаСервереБезКонтекста
Функция ДобавитьВСписокБезПовторений(Список, Значение, Представление = "", Пометка = 0, Картинка = Неопределено)

	Элем = Список.НайтиПоЗначению(Значение);
	Если Элем = Неопределено Тогда
		Если ПустаяСтрока(Представление) Тогда
			Элем = Список.Добавить(Значение, , Пометка, Картинка);
		Иначе
			Элем = Список.Добавить(Значение, Представление, Пометка, Картинка);
		КонецЕсли;
	КонецЕсли;

	Возврат Элем;

КонецФункции


// Функция - Дополнить строку символами
//
// Параметры:
//  Стр				 - Строка - исходная строка
//  Чем				 - Строка - чем дополнять
//  Длина			 - Число - длина результирующей строки
//  ДополнитьСлева	 - Булево - если Истина, - дополняется слева, иначе справа
// 
// Возвращаемое значение:
//  Строка - результирующая строка
//
&НаКлиентеНаСервереБезКонтекста
Функция ДополнитьСтроку(Стр, Чем, Длина, ДополнитьСлева = Истина)
	Добавить = Длина - СтрДлина(Стр);
	Если Добавить > 0 Тогда
		Дополнение = "";
		Для Сч = 1 По Добавить Цикл
			Дополнение = Дополнение + Чем;
		КонецЦикла;

		Возврат ?(ДополнитьСлева, Дополнение + Стр, Стр + Дополнение);
	Иначе
		Возврат Стр;
	КонецЕсли;
КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция МассивВСтроку(Массив, Разделитель)

	Стр = "";
	Для Каждого Элем Из Массив Цикл
		Если Не ПустаяСтрока(Стр) Тогда
			Стр = Стр + Разделитель;
		КонецЕсли;
		Стр = Стр + СокрЛП(Элем);
	КонецЦикла;

	Возврат Стр;

КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция ПрижатьВлево(Стр, RegExpLocal = Неопределено)

	Если RegExpLocal = Неопределено Тогда
		RegExpLocal = Новый COMОбъект("VBScript.RegExp");
	КонецЕсли;
	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = "(^[ \s]*(?=[^ \s]))";
		
	//Возврат RegExpLocal.Replace (Стр, "...");

	Рез = Стр;
	Найдено = RegExpLocal.Execute(Стр);
	Для Каждого Стр Из Найдено Цикл

		Длина = Стр.Length;
		Если Длина <> 0 Тогда
			Рез = "•" + Сред(Рез, Длина + 1);
		КонецЕсли;

	КонецЦикла;

	Возврат Рез;

КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция СтрокаВМассив(Знач Стр, Разделитель)

	сп = Новый Массив;

	ДлинаРазделителя = СтрДлина(Разделитель);
	Если ДлинаРазделителя <> 0 Тогда
		Пока СтрДлина(Стр) > 0 Цикл
			Поз = Найти(Стр, Разделитель);
			Если Поз = 0 Тогда
				сп.Добавить(СокрЛП(Стр));
				Стр="";
			Иначе
				сп.Добавить(СокрЛП(Лев(Стр, Поз - 1)));
				Стр = СокрЛП(Сред(Стр, Поз + ДлинаРазделителя));
			КонецЕсли;
		КонецЦикла;
	Иначе
		ДлинаСтроки = СтрДлина(Стр);
		Для Инд = 1 По ДлинаСтроки Цикл
			сп.Добавить(Сред(Стр, Инд, 1));
		КонецЦикла;
	КонецЕсли;

	Возврат сп;

КонецФункции
&НаКлиентеНаСервереБезКонтекста
Функция СтрокаВСписокЗначений(Знач Стр, Разделитель)

	сп = Новый СписокЗначений;

	ДлинаРазделителя = СтрДлина(Разделитель);
	Если ДлинаРазделителя <> 0 Тогда
		Пока СтрДлина(Стр) > 0 Цикл
			Поз = Найти(Стр, Разделитель);
			Если Поз = 0 Тогда
				сп.Добавить(СокрЛП(Стр));
				Стр="";
			Иначе
				сп.Добавить(СокрЛП(Лев(Стр, Поз - 1)));
				Стр = СокрЛП(Сред(Стр, Поз + ДлинаРазделителя));
			КонецЕсли;
		КонецЦикла;
	Иначе
		ДлинаСтроки = СтрДлина(Стр);
		Для Инд = 1 По ДлинаСтроки Цикл
			сп.Добавить(Сред(Стр, Инд, 1));
		КонецЦикла;
	КонецЕсли;

	Возврат сп;

КонецФункции
#КонецОбласти
&НаКлиенте
Функция ПреобразоватьИмяПараметраВИдентификатор(Знач СтрИд)

	Стр0 = СокрЛП(СтрЗаменить(СтрИд, "-", " "));
	Стр0 = СтрЗаменить(Стр0, Объект.ЛеваяСкобкаПараметра, "");
	Стр0 = СтрЗаменить(Стр0, Объект.ПраваяСкобкаПараметра, "");

	Ид = "";
	Пока 1 = 1 Цикл
		Поз = Найти(Стр0, " ");
		Если Поз <> 0 Тогда
			Стр1 = Лев(Стр0, Поз - 1);
			Стр0 = СокрЛ(Сред(Стр0, Поз + 1));
			Ид = Ид + ВРег(Лев(Стр1, 1)) + Сред(Стр1, 2);
		Иначе
			Ид = Ид + ВРег(Лев(Стр0, 1)) + Сред(Стр0, 2);
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Возврат "id" + Ид;

КонецФункции
&НаКлиенте
Функция СформироватьШаблон(Маска)
	// ДанныеФормыКоллекция
	Шаблон = Маска;
	Сборка = Новый СписокЗначений;
	
	//Из списка параметров удалить все пустые (неопределенные) параметры
	НовыеПараметры = Новый СписокЗначений;
	ПараметрыШаблона = Объект.Параметры;
	Кво = ПараметрыШаблона.Количество();
	Для Инд0 = 1 По Кво Цикл
		Инд = Кво - Инд0;
		Парам = ПараметрыШаблона[Инд];

		Если Найти(Парам.ЗамещатьСписок, "+" + Маска) <> 0 Тогда
			Замещать = Истина;
		ИначеЕсли Найти(Парам.ЗамещатьСписок, "-" + Маска) <> 0 Тогда
			Замещать = Ложь;
		Иначе
			Замещать =  Парам.Замещать;
		КонецЕсли;

		Если Не Замещать И ПустаяСтрока(Парам.Значение) И Парам.Удалить Тогда
			ПараметрыШаблона.Удалить(Инд);
		Иначе
			НовыеПараметры.Добавить(Парам.Наименование);
		КонецЕсли;
	КонецЦикла;
	
	//Выполнять замещения параметров
	Процесс = Истина;
	Пока Процесс Цикл
		ШаблонДо = Шаблон;
		Для Каждого Парам Из ПараметрыШаблона Цикл

			Если Найти(Парам.ЗамещатьСписок, "+" + Маска) <> 0 Тогда
				Замещать = Истина;
			ИначеЕсли Найти(Парам.ЗамещатьСписок, "-" + Маска) <> 0 Тогда
				Замещать = Ложь;
			Иначе
				Замещать =  Парам.Замещать;
			КонецЕсли;

			Если Замещать Тогда
				СтрокаЗамены = Парам.Значение;

				Если Найти(Парам.ИзвлечьСписок, "+" + Маска) <> 0 Тогда
					Извлечь = Истина;
				ИначеЕсли Найти(Парам.ИзвлечьСписок, "-" + Маска) <> 0 Тогда
					Извлечь = Ложь;
				Иначе
					Извлечь =  Парам.Извлечь;
				КонецЕсли;

				Если Извлечь Тогда
					Если Лев(СтрокаЗамены, 3) = "(?:" И Прав(СтрокаЗамены, 1) = ")" Тогда
						СтрокаЗамены = "(" + Сред(СтрокаЗамены, 4);
					Иначе
						СтрокаЗамены = "(" + СтрокаЗамены + ")";
					КонецЕсли;
				КонецЕсли;

				До = Шаблон;
				Шаблон = СтрЗаменить(Шаблон, Парам.Наименование, СтрокаЗамены);
				Если До <> Шаблон Тогда
					ДобавитьВСписокБезПовторений(Сборка, Парам.Наименование, СтрокаЗамены, Извлечь);
				КонецЕсли;
			КонецЕсли;
		КонецЦикла;

		Процесс = (Шаблон <> ШаблонДо);
	КонецЦикла;
	
	//Сформировать список пустых (неопределенных) параметров
	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = "(" + ПолучитьШаблонПараметра() + ")";

	Найдено = RegExpLocal.Execute(Шаблон);

	Для Каждого Стр Из Найдено Цикл
		Парам = Стр.SubMatches(0);

		Если НовыеПараметры.НайтиПоЗначению(Парам) = Неопределено Тогда
			КонтрольУникальностиПараметра(Парам, "СформироватьШаблон");
			НовыеПараметры.Добавить(Парам);
			НовПарам = ПараметрыШаблона.Добавить();
			НовПарам.Наименование = Парам;
			НовПарам.Ссылка = Новый УникальныйИдентификатор;
			НовПарам.Замещать = Истина;

			Сборка.Добавить(НовПарам.Наименование, "Неопределено");
		КонецЕсли;
	КонецЦикла;
	
	
	//Сформировать Код 1С

	ПорядокСборки = Новый СписокЗначений;
	ПорядокСборки.Добавить("Pattern", Маска);
	Указатель = 0;

	Код1С = "//	Выражение = " + Маска + "
										   |//
										   |//	Левая скобка параметра = " + Объект.ЛеваяСкобкаПараметра + "
																											 |//	Правая скобка параметра = "
		+ Объект.ПраваяСкобкаПараметра + "
										 |//	Шаблон имени = " + Объект.ШаблонИмениПараметра + "
																								 |//
																								 |";

	Код1СФрагмент = "";

	Для Каждого Уни Из Сборка Цикл
		Код1С = Код1С + "//" + Символы.Таб + "+" + ?(Уни.Пометка, "+", "-") + Символы.Таб + Уни.Значение + " = "
			+ Уни.Представление + Символы.ПС;
	КонецЦикла;
	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = ПолучитьШаблонПараметра();

	Пока Указатель < ПорядокСборки.Количество() Цикл
		Элем = ПорядокСборки[Указатель];

		ТекШаблон = СтрЗаменить(Элем.Представление, """", """""");

		Найдено = RegExpLocal.Execute(ТекШаблон);
		Для Каждого Стр Из Найдено Цикл

			Наименование = Стр.Value;
			ТекСб = Сборка.НайтиПоЗначению(Наименование);
			Если ТекСб = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			Значение = ТекСб.Представление;

			НайденЭлем = ПорядокСборки.НайтиПоЗначению(Наименование);
			Если ПорядокСборки.НайтиПоЗначению(Наименование) = Неопределено Тогда
				ПорядокСборки.Добавить(Наименование, Значение, ТекСб.Пометка);
			Иначе
				//ОпуститьВниз
				Индекс = ПорядокСборки.Индекс(НайденЭлем);
				Сдвиг = ПорядокСборки.Количество() - Индекс - 1;
				Если Индекс <= Указатель И Сдвиг <> 0 Тогда
					Указатель = Указатель - 1;
					ПорядокСборки.Сдвинуть(НайденЭлем, Сдвиг);
				КонецЕсли;
			КонецЕсли;

			ТекШаблон = СтрЗаменить(ТекШаблон, Наименование, """ + " + ПреобразоватьИмяПараметраВИдентификатор(
				Наименование) + " + """);
		КонецЦикла;

		Элем.Представление = СтрЗаменить(ТекШаблон, "+ """" +", "+");

		Указатель = Указатель + 1;
	КонецЦикла;

	Кво = ПорядокСборки.Количество();
	Для Инд = 1 По Кво Цикл
		Элем = ПорядокСборки[Кво - Инд];
		Элем.Значение = ПреобразоватьИмяПараметраВИдентификатор(Элем.Значение);

		Врем = Элем.Представление;
		Если Лев(Врем, 4) = """ + " Тогда
			Врем = Сред(Врем, 5);
		Иначе
			Врем = """" + Врем;
		КонецЕсли;

		Если Прав(Врем, 4) = " + """ Тогда
			Врем = Лев(Врем, СтрДлина(Врем) - 4);
		Иначе
			Врем = Врем + """";
		КонецЕсли;

		Код1СФрагмент = Код1СФрагмент + Символы.ПС + Элем.Значение + " = " + Врем + ";";
	КонецЦикла;

	Код1С = Код1С + Символы.ПС + Код1СФрагмент;
	Контроль = "";
	Код1СФрагмент = Код1СФрагмент + "
									|Контроль = idPattern;
									|";
	Попытка
		Выполнить (Код1СФрагмент);
	Исключение

	КонецПопытки;

	ИзвлекаютсяВПорядке = ПолучитьПорядокИзвлеченныхЗначений();

	Код1СФрагмент = "	
					|RegExpLocal = Новый COMОбъект(""VBScript.RegExp"");
					|	
					|RegExpLocal.Multiline = " + ?(Объект.Multiline, "Истина", "Ложь") + ";
																						 |RegExpLocal.Global = " + ?(
		Объект.Global, "Истина", "Ложь") + ";
										   |RegExpLocal.IgnoreCase = " + ?(Объект.IgnoreCase, "Истина", "Ложь") + ";
																												  |RegExpLocal.Pattern = idPattern;
																												  |	
																												  |Найдено = RegExpLocal.Execute(ОбрабатываемыйТекст);
																												  |Для каждого Стр Из Найдено Цикл
																												  |
																												  |	Начало = Стр.FirstIndex;
																												  |	Длина = Стр.Length;
																												  |	Значение = Стр.Value;
																												  |		";
	Если ИзвлекаютсяВПорядке.Количество() <> 0 Тогда
		ПорядокСтрокой = "";
		Инд = 0;
		Для Каждого Элем Из ИзвлекаютсяВПорядке Цикл
			Код1СФрагмент = Код1СФрагмент + "
											|	v" + Элем.Значение + " = Стр.SubMatches(" + Инд + ");";
			Если Не ПустаяСтрока(ПорядокСтрокой) Тогда
				ПорядокСтрокой = ПорядокСтрокой + "; ";
			КонецЕсли;
			ПорядокСтрокой = ПорядокСтрокой + Элем.Представление;
			Инд = Инд + 1;
		КонецЦикла;
	Иначе
		ПорядокСтрокой = "Понятия не имею что за параметры.";
		Код1СФрагмент = Код1СФрагмент + "
										|		
										|	КвоПодстрок = Стр.SubMatches.Count;
										|	Для Инд = 1 По КвоПодстрок Цикл
										|		Подстрока = Стр.SubMatches(Инд-1);
										|	КонецЦикла;";

	КонецЕсли;

	Код1СФрагмент = Код1СФрагмент + "
									|		
									|КонецЦикла;";

	Код1С = Код1С + Символы.ПС + Код1СФрагмент;

	Если Контроль <> Шаблон Тогда
		ПоказатьПредупреждение( , "В сформированном шаблоне регулярного выражения для 1С обнаружены ошибки!");
	КонецЕсли;

	Возврат Шаблон;
КонецФункции // СформироватьШаблон()
&НаКлиенте
Функция ПолучитьШаблонПараметра()

	ЛеваяСкобка = СокрЛП(Объект.ЛеваяСкобкаПараметра);
	ПраваяСкобка = СокрЛП(Объект.ПраваяСкобкаПараметра);
	Шаблон = ЛеваяСкобка + СокрЛП(Объект.ШаблонИмениПараметра) + ПраваяСкобка;

	Возврат Шаблон;

КонецФункции // ПолучитьШаблонПараметра()
&НаКлиенте
Процедура Тест(Команда)

	Если ПустаяСтрока(Объект.Маска) Тогда
		Возврат;
	КонецЕсли;

	ТестФрагмент();

КонецПроцедуры

&НаКлиенте
Процедура ТестФрагмент()

	Перем ВсегоСтрок, Инд, Сообщение, Стр;

	Объект.МаскаРезультата = СформироватьШаблон(Объект.Маска);

	RegExpLocal.Multiline = Объект.Multiline;
	RegExpLocal.Global = Объект.Global;
	RegExpLocal.IgnoreCase = Объект.IgnoreCase;
	RegExpLocal.Pattern = Объект.МаскаРезультата;

	Объект.Результат = "";
	Если Не Объект.Multiline Тогда
		ВсегоСтрок = СтрЧислоСтрок(Объект.Текст);
		Для Инд = 1 По ВсегоСтрок Цикл
			Стр = СтрПолучитьСтроку(Объект.Текст, Инд);

			Если RegExpLocal.Test(Стр) Тогда
				Сообщение = "(!!)     " + Стр;
			Иначе
				Сообщение = "(#)     " + Стр;
			КонецЕсли;

			Объект.Результат = Объект.Результат + Сообщение + Символы.ПС;
		КонецЦикла;
	Иначе
		Сообщение = Новый СообщениеПользователю;
		Если RegExpLocal.Test(Объект.Текст + Объект.КонецТекста) Тогда
			Объект.Результат = "Результат положительный";
		Иначе
			Объект.Результат = "Результат отрицательный";
		КонецЕсли;
	КонецЕсли;

	ТекущийЭлемент = Элементы.Замена;

КонецПроцедуры
&НаКлиенте
Процедура ПоискВыражений(Команда)

	Если ПустаяСтрока(Объект.Маска) Тогда
		Возврат;
	КонецЕсли;

	ПоискВыраженийФрагмент();

КонецПроцедуры

&НаКлиенте
Процедура ПоискВыраженийФрагмент()

	Перем Длина, Значение, Инд, КвоПодстрок, Конец, Найдено, Начало, НовыйФрагмент, НомерРез, Стр, ЭлементФД, ЭлементыФД;

	Если ФорматированныйТекст Тогда
		Если ВосстанавливатьАвтоматически Тогда
			Представление.УстановитьФорматированнуюСтроку(Буфер.ПолучитьФорматированнуюСтроку());
		КонецЕсли;

		Объект.Текст = Представление.ПолучитьТекст();
	КонецЕсли;

	Объект.МаскаРезультата = СформироватьШаблон(Объект.Маска);

	RegExpLocal.Multiline = Объект.Multiline;
	RegExpLocal.Global = Объект.Global;
	RegExpLocal.IgnoreCase = Объект.IgnoreCase;
	RegExpLocal.Pattern = Объект.МаскаРезультата;

	Фрагменты.Очистить();
	Уникальные.Очистить();
	ВКакихФрагментахСсылки.Очистить();

	НомерРез = 0;
	Найдено = RegExpLocal.Execute(Объект.Текст + Объект.КонецТекста);
	НомерРез = 0;
	Для Каждого Стр Из Найдено Цикл
		НомерРез = НомерРез + 1;

		Начало = Стр.FirstIndex;
		Длина = Стр.Length;
		Конец = Начало + Длина;
		КвоПодстрок = Стр.SubMatches.Count;
		Значение = Стр.Value;
		ПредставлениеЗначения = ПрижатьВлево(Значение, RegExpLocal);

		НовыйФрагмент = Фрагменты.Добавить();
		НовыйФрагмент.ПП = НомерРез;
		НовыйФрагмент.Индекс = Начало;
		НовыйФрагмент.Длина = Длина;
		НовыйФрагмент.Значение = Значение;
		НовыйФрагмент.Представление = ПредставлениеЗначения;
		Для Инд = 1 По КвоПодстрок Цикл
			ПредставлениеПодстроки = ПрижатьВлево(Стр.SubMatches(Инд - 1), RegExpLocal);
			НовыйФрагмент.Подстрока.Добавить(Стр.SubMatches(Инд - 1), ПредставлениеПодстроки);
		КонецЦикла;

		ЭлементыФД = Представление.СформироватьЭлементы(Представление.ПолучитьЗакладкуПоПозиции(Начало),
			Представление.ПолучитьЗакладкуПоПозиции(Конец));
		Для Каждого ЭлементФД Из ЭлементыФД Цикл
			Если ТипЗнч(ЭлементФД) = Тип("ТекстФорматированногоДокумента") Тогда
				ЭлементФД.ЦветТекста = ЦветВыделения;
			КонецЕсли;
		КонецЦикла;

	КонецЦикла;

	Если Элементы.Раскраска.Видимость Тогда
		ЗаполнитьРаскраску();
	КонецЕсли;

	ТекущийЭлемент = Элементы.Поиск;
	ТекущийЭлемент = Элементы.ГруппаРаскраска;
	//ТекущийЭлемент = Элементы.Фрагменты;
	Если Фрагменты.Количество() <> 0 Тогда
		Элементы.Фрагменты.ТекущаяСтрока = Фрагменты[0].ПолучитьИдентификатор();
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура Замена(Команда)

	Если ПустаяСтрока(Объект.Маска) Тогда
		Возврат;
	КонецЕсли;

	Объект.МаскаРезультата = СформироватьШаблон(Объект.Маска);

	RegExpLocal.Multiline = Объект.Multiline;
	RegExpLocal.Global = Объект.Global;
	RegExpLocal.IgnoreCase = Объект.IgnoreCase;
	RegExpLocal.Pattern = Объект.МаскаРезультата;

	НомерРез = 0;
	Объект.Результат = "";
	Если Не Объект.Multiline Тогда
		ВсегоСтрок = СтрЧислоСтрок(Объект.Текст);
		Для Инд = 1 По ВсегоСтрок Цикл
			СтрокаТекста = СтрПолучитьСтроку(Объект.Текст, Инд);

			Если RegExpLocal.Test(СтрокаТекста) Тогда
				СтрокаТекста = RegExpLocal.Replace (СтрокаТекста, Объект.ТекстПодстановки);
				Объект.Результат = Объект.Результат + СтрокаТекста + Символы.ПС;
			КонецЕсли;
		КонецЦикла;
		Объект.Результат = Объект.Результат + ДополнитьСтроку("", "·", 28) + "конец обработки" + ДополнитьСтроку("",
			"·", 28);

	Иначе
		Объект.Результат = RegExpLocal.Replace (Объект.Текст + Объект.КонецТекста, Объект.ТекстПодстановки);
		Объект.Результат = Объект.Результат + ДополнитьСтроку("", "·", 28) + "конец обработки" + ДополнитьСтроку("",
			"·", 28);
	КонецЕсли;

	ТекущийЭлемент = Элементы.Замена;

КонецПроцедуры

&НаКлиенте
Процедура СинтаксисРегулярныхВыраженийНажатие(Элемент)
	ОткрытьСправкуФормы();
КонецПроцедуры

&НаСервере
Процедура ПередЗагрузкойДанныхИзНастроекНаСервере(Настройки)
	ТаблицаПараметров = Настройки.Получить ("Объект.ТаблицаПараметров");
	Если ТаблицаПараметров <> Неопределено Тогда
		Объект.Параметры.Загрузить(ТаблицаПараметров);
	КонецЕсли;

	ПредставлениеВХранилище = Настройки.Получить("Представление");
	Если ПредставлениеВХранилище <> Неопределено Тогда
		Представление = ПредставлениеВХранилище.Получить();
	КонецЕсли;

	БуферВХранилище = Настройки.Получить("Буфер");
	Если БуферВХранилище <> Неопределено Тогда
		Буфер = БуферВХранилище.Получить();
	КонецЕсли;

	ЦветВыделения = Настройки.Получить("ЦветВыделения");
КонецПроцедуры

&НаСервере
Процедура ПриСохраненииДанныхВНастройкахНаСервере(Настройки)
	ТаблицаПараметров = Объект.Параметры.Выгрузить();
	Настройки.Вставить("Объект.ТаблицаПараметров", ТаблицаПараметров);
	Настройки.Вставить("Представление", Новый ХранилищеЗначения(Представление));
	Настройки.Вставить("Буфер", Новый ХранилищеЗначения(Буфер));
	Настройки.Вставить("ЦветВыделения", ЦветВыделения);
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыПриИзменении(Элемент)
	СохраняемыеВНастройкахДанныеМодифицированы = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)

	RegExpLocal = Новый COMОбъект("VBScript.RegExp");

	УстановитьВидимость();
	ДеревоПараметровПостроить = Истина;

	Если ПустаяСтрока(Объект.ЛеваяСкобкаПараметра) Тогда
		Объект.ЛеваяСкобкаПараметра = "<";
		Объект.ПраваяСкобкаПараметра = ">";
		Объект.ШаблонИмениПараметра = "[А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?";
		Объект.КонецТекста = "";

		Объект.Multiline = Истина;
		Объект.Global = Истина;
		Объект.IgnoreCase = Истина;
	КонецЕсли;

	ПередИзменениемЛеваяСкобкаПараметра = Объект.ЛеваяСкобкаПараметра;
	ПередИзменениемПраваяСкобкаПараметра = Объект.ПраваяСкобкаПараметра;

	Элементы.ТекстКонтекстноеМенюфФорматированныйТекст.Пометка = ФорматированныйТекст;
	Элементы.ПредставлениеКонтекстноеМенюфФорматированныйТекст.Пометка = ФорматированныйТекст;
	Элементы.ПредставлениеКонтекстноеМенюфВосстанавливатьАвтоматически.Пометка = ВосстанавливатьАвтоматически;

	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());

	ВКакихФрагментахСсылки = Новый Соответствие;

КонецПроцедуры
&НаКлиенте
Процедура ПриЗакрытии()
	
	//Объект.Текст = Представление.ПолучитьТекст();

КонецПроцедуры
&НаКлиенте
Процедура МаскаНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	СписокВыбора = Элемент.СписокВыбора;
	СписокВыбора.Очистить();

	Список = ПолучитьСписокВыбора();
	Для Каждого Эл Из Список Цикл
		СписокВыбора.Добавить(Эл.Представление);
	КонецЦикла;

	ПоказатьВыборИзМеню(Новый ОписаниеОповещения("МаскаНачалоВыбораЗавершение", ЭтаФорма), Элемент.СписокВыбора);

КонецПроцедуры

&НаКлиенте
Процедура МаскаНачалоВыбораЗавершение(ВыбранныйЭлемент, ДополнительныеПараметры) Экспорт

	Пункт = ВыбранныйЭлемент;
	Если Пункт <> Неопределено Тогда
		Объект.Маска = Пункт.Значение;
	КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура МаскаАвтоПодбор(Элемент, Текст, ДанныеВыбора, Параметры, Ожидание, СтандартнаяОбработка)

	Если ПустаяСтрока(Текст) Тогда
		Возврат;
	КонецЕсли;
	ОбщаяМаска = СтрЗаменить(Текст, "  ", " ");
	ВсеМаски = СтрокаВСписокЗначений(ОбщаяМаска, " ");

	ДанныеВыбора = Новый СписокЗначений;

	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;

	Попытка
		Список = ПолучитьСписокВыбора(Истина);
		Для Каждого ТекВар Из Список Цикл

			Включить = Истина;
			Для Каждого Маска Из ВсеМаски Цикл
				RegExpLocal.Pattern = Маска.Значение;

				Если Не RegExpLocal.Test(Строка(ТекВар)) Тогда
					Включить = Ложь;
					Прервать;
				КонецЕсли;
			КонецЦикла;

			Если Включить Тогда
				ДанныеВыбора.Добавить(ТекВар);
			КонецЕсли;

		КонецЦикла;
	Исключение
		ДанныеВыбора.Очистить();
	КонецПопытки;

	СтандартнаяОбработка = Ложь;

КонецПроцедуры
&НаКлиенте
Процедура СохранитьВБуфер(Команда)

	Если Элементы.Представление.Видимость Тогда
		Буфер.УстановитьФорматированнуюСтроку(Представление.ПолучитьФорматированнуюСтроку());
	Иначе

		ПараметрыШаблона = Объект.Параметры;

		Условие = Новый Структура("Наименование", Объект.Маска);
		СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);

		Если СтрокаТЧ.Количество() <> 0 Тогда
			Парам = СтрокаТЧ[0];
			Парам.Тест = Объект.Текст;
			СохраняемыеВНастройкахДанныеМодифицированы = Истина;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура ВосстановитьИзБуфера(Команда)

	Если Элементы.Представление.Видимость Тогда
		Представление.УстановитьФорматированнуюСтроку(Буфер.ПолучитьФорматированнуюСтроку());
	Иначе
		УстановитьТекст();
		//ПараметрыШаблона = Объект.Параметры;

		//Условие = Новый Структура("Наименование", Объект.Маска);
		//СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
		//	
		//Если СтрокаТЧ.Количество() <> 0  Тогда
		//	Парам = СтрокаТЧ[0];
		//	Объект.Текст = Парам.Тест;
		//КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЦветВыделенияПриИзменении(Элемент)
	СохраняемыеВНастройкахДанныеМодифицированы = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьДеревоНаКлиенте(Список, Порядок = Ложь)

	Если Порядок Тогда
		ТекДерево = ДеревоПорядка.ПолучитьЭлементы();
	Иначе
		ТекДерево = ДеревоПараметров.ПолучитьЭлементы();
	КонецЕсли;
	ТекДерево.Очистить();

	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = ПолучитьШаблонПараметра();

	ПараметрыШаблона = Объект.Параметры;

	Для Каждого Эл Из Список Цикл
		Стру1 = ПараметрыШаблона[Эл.Значение];
		НоваяСтрока = ТекДерево.Добавить();
		НоваяСтрока.Ссылка = СтрУ1.Ссылка;
		НоваяСтрока.Наименование = СтрУ1.Наименование;
		НоваяСтрока.Значение = СтрУ1.Значение;
		НоваяСтрока.Форматирование = СтрУ1.Форматирование;
		НоваяСтрока.Варианты = СтрУ1.Варианты;
		НоваяСтрока.Уровень = 0;

		Если Найти(СтрУ1.ЗамещатьСписок, "+" + СтрУ1.Наименование) <> 0 Тогда
			НоваяСтрока.Замещать = Истина;
		ИначеЕсли Найти(СтрУ1.ЗамещатьСписок, "-" + СтрУ1.Наименование) <> 0 Тогда
			НоваяСтрока.Замещать = Ложь;
		Иначе
			НоваяСтрока.Замещать =  Стру1.Замещать;
		КонецЕсли;

		Если Найти(СтрУ1.ИзвлечьСписок, "+" + СтрУ1.Наименование) <> 0 Тогда
			НоваяСтрока.Извлечь = Истина;
		ИначеЕсли Найти(СтрУ1.ИзвлечьСписок, "-" + СтрУ1.Наименование) <> 0 Тогда
			НоваяСтрока.Извлечь = Ложь;
		Иначе
			НоваяСтрока.Извлечь =  Стру1.Извлечь;
		КонецЕсли;

		Если RegExpLocal.Test(НоваяСтрока.Значение) Тогда
			НоваяСтрока.ПолучитьЭлементы().Добавить();
		КонецЕсли;
	КонецЦикла;

	ДеревоПараметровПостроить = Ложь;
	ДеревоПараметровОбновить = Ложь;

КонецПроцедуры // ОбновитьДеревоНаКлиенте
&НаКлиенте
Процедура ОбновитьДерево(Команда)

	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());

КонецПроцедуры

&НаКлиенте
Процедура ФорматированныйТекстПриИзменении(Элемент)

	УстановитьВидимость();

КонецПроцедуры

&НаКлиенте
Процедура УстановитьВидимость()
    
	//Если ФорматированныйТекст Тогда
	//	Элементы.Представление.Видимость = Истина;
	//	Элементы.ПредставлениеДействия.Видимость = Истина;
	//	Элементы.Текст.Видимость = Ложь;
	//	Элементы.Раскраска.Видимость = Ложь;
	//Иначе
	//	Элементы.Текст.Видимость = Истина;
	//	Элементы.Раскраска.Видимость = Истина;
	//	Элементы.Представление.Видимость = Ложь;
	//	Элементы.ПредставлениеДействия.Видимость = Ложь;
	//КонецЕсли;

КонецПроцедуры
&НаКлиенте
Функция ПолучитьСписокВыбора(Полный = Ложь, Вариант = "")

	Если ПустаяСтрока(Вариант) Тогда
		ТекВариант = ВариантыЗаполненияДерева;
	Иначе
		ТекВариант = Вариант;
	КонецЕсли;
	Список = Новый СписокЗначений;
	ПараметрыШаблона = Объект.Параметры;
	Если Не Полный И ТекВариант = "Текущее выражение" Тогда
		Найдено = ПараметрыШаблона.НайтиСтроки(Новый Структура("Наименование", Объект.Маска));
		Если Найдено.Количество() <> 0 Тогда
			ИндМакс = Найдено.ВГраница();
			Для Инд = 0 По ИндМакс Цикл
				ТекСтр = Найдено[Инд];
				Список.Добавить(ТекСтр.НомерСтроки - 1, ТекСтр.Наименование);
			КонецЦикла;
		КонецЕсли;

	Иначе
		Если Не Полный Тогда
			Для Каждого СтрУ1 Из ПараметрыШаблона Цикл

				Если ПустаяСтрока(СтрУ1.Значение) Тогда
					Продолжить;
				КонецЕсли;

				НетВхождений = Истина;
				Если ТекВариант = "Основные выражения" Тогда
					Если Не Полный Тогда
						Для Каждого СтрУ2 Из ПараметрыШаблона Цикл
							Если Найти(СтрУ2.Значение, СтрУ1.Наименование) <> 0 Тогда
								НетВхождений = Ложь;
								Прервать;
							КонецЕсли;
						КонецЦикла;
					КонецЕсли;
				КонецЕсли;

				Если НетВхождений Тогда
					Список.Добавить(СтрУ1.НомерСтроки - 1, СтрУ1.Наименование);
				КонецЕсли;
			КонецЦикла;
		Иначе
			Для Каждого СтрУ1 Из ПараметрыШаблона Цикл
				Если ПустаяСтрока(СтрУ1.Значение) Тогда
					Продолжить;
				КонецЕсли;

				Список.Добавить(СтрУ1.НомерСтроки - 1, СтрУ1.Наименование);
			КонецЦикла;
		КонецЕсли;

	КонецЕсли;

	Возврат Список;

КонецФункции // ПолучитьСписокВыбора()

&НаКлиенте
Процедура Группа4ПриСменеСтраницы(Элемент, ТекущаяСтраница)

	Если ТекущаяСтраница = Элементы.ГруппаДерево Тогда
		Если ДеревоПараметровПостроить Тогда
			ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());

		ИначеЕсли ДеревоПараметровОбновить Тогда

		КонецЕсли;

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыНаименованиеПриИзменении(Элемент)

	ДеревоПараметровПостроить = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыВыборПриИзменении(Элемент)

	ДеревоПараметровПостроить = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗамещатьПриИзменении(Элемент)

	ДеревоПараметровОбновить = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыИзвлечьПриИзменении(Элемент)

	ДеревоПараметровОбновить = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыЗначениеПриИзменении(Элемент)

	ДеревоПараметровОбновить = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ВключитьПодчиненные(Знач СтрокаДерева, СПодчиненными = Ложь)

	Если СтрокаДерева = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Предок = ПолучитьПредка(СтрокаДерева);

	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = ПолучитьШаблонПараметра();

	ПараметрыШаблона = Объект.Параметры;
	Условие = Новый Структура;

	Строки = СтрокаДерева.ПолучитьЭлементы();
	Строки.Очистить();
	Уровень = СтрокаДерева.Уровень + 1;

	Найдено = RegExpLocal.Execute(СтрокаДерева.Значение);
	Список = Новый СписокЗначений;

	Для Каждого Парам Из Найдено Цикл
		ДобавитьВСписокБезПовторений(Список, Парам.Value);
	КонецЦикла;

	Для Каждого Парам Из Список Цикл
		Наименование = Парам.Значение;

		Условие.Вставить("Наименование", Парам.Значение);
		СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
		Если СтрокаТЧ.Количество() <> 0 Тогда
			Ссылка = СтрокаТЧ[0].Ссылка;
			Значение = СтрокаТЧ[0].Значение;
			Форматирование = СтрокаТЧ[0].Форматирование;
			Варианты = СтрокаТЧ[0].Варианты;

			Если Найти(СтрокаТЧ[0].ЗамещатьСписок, "+" + Предок.Наименование) <> 0 Тогда
				Замещать = Истина;
			ИначеЕсли Найти(СтрокаТЧ[0].ЗамещатьСписок, "-" + Предок.Наименование) <> 0 Тогда
				Замещать = Ложь;
			Иначе
				Замещать =  СтрокаТЧ[0].Замещать;
			КонецЕсли;

			Если Найти(СтрокаТЧ[0].ИзвлечьСписок, "+" + Предок.Наименование) <> 0 Тогда
				Извлечь = Истина;
			ИначеЕсли Найти(СтрокаТЧ[0].ИзвлечьСписок, "-" + Предок.Наименование) <> 0 Тогда
				Извлечь = Ложь;
			Иначе
				Извлечь =  СтрокаТЧ[0].Извлечь;
			КонецЕсли;

		Иначе
			Ссылка = "";
			Значение = "";
			Форматирование = "";
			Варианты = "";
			Замещать = Ложь;
			Извлечь = Ложь;
		КонецЕсли;

		НоваяСтрока = Строки.Добавить();
		НоваяСтрока.Ссылка = Ссылка;
		НоваяСтрока.Наименование = Наименование;
		НоваяСтрока.Замещать = Замещать;
		НоваяСтрока.Извлечь = Извлечь;
		НоваяСтрока.Значение = Значение;
		НоваяСтрока.Форматирование = Форматирование;
		НоваяСтрока.Варианты = Варианты;
		НоваяСтрока.Уровень = Уровень;

		Если RegExpLocal.Test(НоваяСтрока.Значение) Тогда
			НоваяСтрока.ПолучитьЭлементы().Добавить();
		КонецЕсли;

		Если СПодчиненными Тогда
			ВключитьПодчиненные(НоваяСтрока, СПодчиненными);
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Функция ПолучитьПредка(Знач СтрокаДерева)

	Предок = СтрокаДерева;
	Родитель = Предок.ПолучитьРодителя();
	Пока Родитель <> Неопределено Цикл
		Предок = Родитель;
		Родитель = Предок.ПолучитьРодителя();
	КонецЦикла;

	Возврат Предок;

КонецФункции

&НаКлиенте
Процедура ДеревоПараметровПередРазворачиванием(Элемент, Строка, Отказ)

	РазворачиваемыйУзел = ДеревоПараметров.НайтиПоИдентификатору(Строка);

	Если Не ТолькоПросмотрДереваПараметров Тогда
		Дерево = Элементы.ДеревоПараметров;

		Родитель = РазворачиваемыйУзел.ПолучитьРодителя();
		Если Родитель = Неопределено Тогда
			Строки = ДеревоПараметров.ПолучитьЭлементы();
		Иначе
			Строки = Родитель.ПолучитьЭлементы();
		КонецЕсли;

		Для Каждого Стр Из Строки Цикл
			Ид = Стр.ПолучитьИдентификатор();
			Если Дерево.Развернут(Ид) Тогда
				Дерево.Свернуть(Ид);
				Прервать;
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	ВключитьПодчиненные(РазворачиваемыйУзел);
	Элементы.ДеревоПараметров.ТекущаяСтрока = Строка;
	//Если РазворачиваемыйУзел <> Неопределено  Тогда
	//	Предок = ПолучитьПредка(РазворачиваемыйУзел);
	//	Элементы.ДеревоПараметров.ТекущаяСтрока = Предок.ПолучитьИдентификатор();
	//КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДеревоПараметровПередСворачиванием(Элемент, Строка, Отказ)

	Элементы.ДеревоПараметров.ТекущаяСтрока = Строка;
	СворачиваемыйУзел = ДеревоПараметров.НайтиПоИдентификатору(Строка);
	//Если СворачиваемыйУзел <> Неопределено  Тогда
	//	Предок = ПолучитьПредка(СворачиваемыйУзел);
	//	Элементы.ДеревоПараметров.ТекущаяСтрока = Предок.ПолучитьИдентификатор();
	//КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДеревоПараметровЗамещатьПриИзменении(Элемент)

	СтрокаДерева = ДеревоПараметров.НайтиПоИдентификатору(Элемент.Родитель.ТекущаяСтрока);
	Предок = ПолучитьПредка(СтрокаДерева);

	ПараметрыШаблона = Объект.Параметры;
	Условие = Новый Структура;

	Условие.Вставить("Наименование", СтрокаДерева.Наименование);
	СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
	Если СтрокаТЧ.Количество() <> 0 Тогда
		СтрокаТЧ[0].ЗамещатьСписок = СтрЗаменить(СтрокаТЧ[0].ЗамещатьСписок, "+" + Предок.Наименование, "");
		СтрокаТЧ[0].ЗамещатьСписок = СтрЗаменить(СтрокаТЧ[0].ЗамещатьСписок, "-" + Предок.Наименование, "");
		Если СтрокаДерева.Замещать Тогда
			СтрокаТЧ[0].ЗамещатьСписок = "+" + Предок.Наименование + СтрокаТЧ[0].ЗамещатьСписок;
		Иначе
			СтрокаТЧ[0].ЗамещатьСписок = "-" + Предок.Наименование + СтрокаТЧ[0].ЗамещатьСписок;
		КонецЕсли;
		СохраняемыеВНастройкахДанныеМодифицированы = Истина;
	КонецЕсли;

	ОбновитьЗначенияПараметраПоДереву(Предок.ПолучитьЭлементы(), СтрокаДерева.Ссылка, СтрокаДерева.Замещать, "Замещать");

КонецПроцедуры

&НаКлиенте
Процедура ДеревоПараметровИзвлечьПриИзменении(Элемент)

	СтрокаДерева = ДеревоПараметров.НайтиПоИдентификатору(Элемент.Родитель.ТекущаяСтрока);
	Предок = ПолучитьПредка(СтрокаДерева);

	ПараметрыШаблона = Объект.Параметры;
	Условие = Новый Структура;

	Условие.Вставить("Наименование", СтрокаДерева.Наименование);
	СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
	Если СтрокаТЧ.Количество() <> 0 Тогда
		СтрокаТЧ[0].ИзвлечьСписок = СтрЗаменить(СтрокаТЧ[0].ИзвлечьСписок, "+" + Предок.Наименование, "");
		СтрокаТЧ[0].ИзвлечьСписок = СтрЗаменить(СтрокаТЧ[0].ИзвлечьСписок, "-" + Предок.Наименование, "");
		Если СтрокаДерева.Извлечь Тогда
			СтрокаТЧ[0].ИзвлечьСписок = "+" + Предок.Наименование + СтрокаТЧ[0].ИзвлечьСписок;
		Иначе
			СтрокаТЧ[0].ИзвлечьСписок = "-" + Предок.Наименование + СтрокаТЧ[0].ИзвлечьСписок;
		КонецЕсли;
		СохраняемыеВНастройкахДанныеМодифицированы = Истина;
	КонецЕсли;

	ОбновитьЗначенияПараметраПоДереву(Предок.ПолучитьЭлементы(), СтрокаДерева.Ссылка, СтрокаДерева.Извлечь, "Извлечь");
КонецПроцедуры

&НаКлиенте
Процедура ДеревоПараметровЗначениеПриИзменении(Элемент)

	ТД = Элементы.ДеревоПараметров.ТекущиеДанные;
	ТД.Форматирование = "";
	ОбновитьУзел(Элемент.Родитель);

КонецПроцедуры

&НаКлиенте
Процедура ОбновитьУзел(Элемент)

	Узел = Элемент;
	ТД = Узел.ТекущиеДанные;
	Ссылка = ТД.Ссылка;
	ПараметрыШаблона = Объект.Параметры;
	Если ПустаяСтрока(Ссылка) Тогда
		КонтрольУникальностиПараметра(ТД.Наименование, "ОбновитьУзел");
		НоваяСтрока = ПараметрыШаблона.Добавить();
		НоваяСтрока.Наименование = ТД.Наименование;
		НоваяСтрока.Замещать = Истина;
		Ссылка = Новый УникальныйИдентификатор;
		ТД.Ссылка = Ссылка;
		ТД.Замещать = Истина;
		НоваяСтрока.Ссылка = ТД.Ссылка;
		Парам = НоваяСтрока;
	Иначе
		Условие = Новый Структура("Ссылка", Ссылка);
		СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
		Если СтрокаТЧ.Количество() = 0 Тогда
			УИ_ОбщегоНазначенияКлиентСервер.СообщитьПользователю("Не найден параметр по ссылке - " + Ссылка);
			Возврат;
		КонецЕсли;
		Парам = СтрокаТЧ[0];
	КонецЕсли;

	Парам.Значение = ТД.Значение;
	Парам.Форматирование = ТД.Форматирование;
	Парам.Варианты = ТД.Варианты;

	Если Объект.Маска = ТД.Наименование Тогда
		Объект.Форматирование = ТД.Форматирование;
		Объект.Варианты = ТД.Варианты;
	КонецЕсли;

	Элементы.ДеревоПараметров.Свернуть(Узел.ТекущаяСтрока);
	ОбновитьЗначенияПараметраПоДереву(ДеревоПараметров.ПолучитьЭлементы(), Ссылка, ТД.Значение);
	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = ПолучитьШаблонПараметра();

	Подчиненные = ТД.ПолучитьЭлементы();
	Если RegExpLocal.Test(ТД.Значение) И Подчиненные.Количество() = 0 Тогда
		Подчиненные.Добавить();
	КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьЗначенияПараметраПоДереву(Строки, Знач Ссылка, Знач НовоеЗначение, Параметр = "Значение")

	Для Каждого Стр Из Строки Цикл
		Если Стр.Ссылка = Ссылка Тогда
			Стр[Параметр] = НовоеЗначение;
		КонецЕсли;

		Если Элементы.ДеревоПараметров.Развернут(Стр.ПолучитьИдентификатор()) Тогда
			ОбновитьЗначенияПараметраПоДереву(Стр.ПолучитьЭлементы(), Ссылка, НовоеЗначение, Параметр);
		КонецЕсли;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура НайтиВПараметрах(Команда)

	ПараметрыШаблона = Объект.Параметры;
	ТД = Элементы.ДеревоПараметров.ТекущиеДанные;
	Если ТД <> Неопределено Тогда
		Условие = Новый Структура("Ссылка", ТД.Ссылка);
		СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
		Если СтрокаТЧ.Количество() = 0 Тогда
			Условие = Новый Структура("Наименование", ТД.Наименование);
			СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
		КонецЕсли;

		Если СтрокаТЧ.Количество() <> 0 Тогда
			Парам = СтрокаТЧ[0];
			Элементы.Параметры.ТекущаяСтрока = Парам.ПолучитьИдентификатор();
			Элементы.Страницы.ТекущаяСтраница = Элементы.ГруппаПараметры;

			ТД.Ссылка = СтрокаТЧ[0].Ссылка;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ДеревоПараметровПередНачаломИзменения(Элемент, Отказ)

	Узел = Элемент;
	ТД = Узел.ТекущиеДанные;
	Колонка = Элемент.ТекущийЭлемент.Имя;

	Если Колонка <> "ДеревоПараметровЗначение" Тогда
		Возврат;
	КонецЕсли;

	ТекЗначение = ТД.Значение;
	Если Не ПустаяСтрока(ТД.Форматирование) Тогда
		ТекЗначение = УстановитьФорматирование(ТекЗначение, ТД.Форматирование);
	КонецЕсли;

	СписокДляВыбора = Новый СписокЗначений;
	Для Каждого Парам Из Объект.Параметры Цикл
		СписокДляВыбора.Добавить(Парам.Наименование, Парам.Наименование + " = " + Парам.Значение);
	КонецЦикла;
	СписокДляВыбора.СортироватьПоЗначению();

	Парам = Новый Структура;
	Парам.Вставить("Заголовок", ТД.Наименование);
	Парам.Вставить("Выражение", ТекЗначение);
	Парам.Вставить("Варианты", ТД.Варианты);
	Парам.Вставить("СписокДляВыбора", СписокДляВыбора);
	Парам.Вставить("ЛеваяСкобкаПараметра", Объект.ЛеваяСкобкаПараметра);
	Парам.Вставить("ПраваяСкобкаПараметра", Объект.ПраваяСкобкапараметра);
	Парам.Вставить("ШаблонИмениПараметра", Объект.ШаблонИмениПараметра);

	ОткрытьФорму("Обработка.УИ_КонструкторРегулярныхВыражений.Форма.РедакторВыражения", Парам, ЭтотОбъект, , , ,
		Новый ОписаниеОповещения("ДеревоПараметровПередНачаломИзмененияЗавершение", ЭтотОбъект,
		Новый Структура("ТД, Элемент", ТД, Элемент)), РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

	Отказ = Истина;
КонецПроцедуры

&НаКлиенте
Процедура ДеревоПараметровПередНачаломИзмененияЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТД=ДополнительныеПараметры.ТД;
	Элемент=ДополнительныеПараметры.Элемент;

	Выражение = Результат.Выражение;
	НовыеПараметры = Результат.НовыеПараметры;
	ДобавитьНовыеПараметрыИзСписка(НовыеПараметры);

	ТД.Форматирование = ИзвлечьФорматирование(Выражение);
	ТД.Значение = Выражение;
	ТД.Варианты = Результат.Варианты;
	ОбновитьУзел(Элемент);

КонецПроцедуры

&НаКлиенте
Процедура ДобавитьНовыеПараметрыИзСписка(НовыеПараметры)

	ПараметрыШаблона = Объект.Параметры;
	Для Каждого НовыйПарам Из НовыеПараметры Цикл
		КонтрольУникальностиПараметра(НовыйПарам.Значение, "ДобавитьНовыеПараметрыИзСписка");
		Парам = ПараметрыШаблона.Добавить();
		Парам.Наименование = НовыйПарам.Значение;
		Парам.Значение = НовыйПарам.Представление;
		Парам.Замещать = Истина;
		Парам.Ссылка = Новый УникальныйИдентификатор;
	КонецЦикла;

КонецПроцедуры
&НаКлиенте
Функция ИзвлечьФорматирование(ФорматированнаяСтрока)

	Форматирование = Новый Массив;

	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = "\t|\n";

	Результат = RegExpLocal.Execute (ФорматированнаяСтрока);
	Для Каждого Стр Из Результат Цикл
		Поз = Стр.FirstIndex;
		Сим = Стр.Value;
		Если Сим = Символы.Таб Тогда
			Форматирование.Добавить(Поз);
		Иначе
			Форматирование.Добавить(-Поз);
		КонецЕсли;
	КонецЦикла;

	ФорматированнаяСтрока = СтрЗаменить(ФорматированнаяСтрока, Символы.Таб, "");
	ФорматированнаяСтрока = СтрЗаменить(ФорматированнаяСтрока, Символы.ПС, "");

	Если Форматирование.Количество() <> 0 Тогда
		Форматирование = МассивВСтроку(Форматирование, ",");
	Иначе
		Форматирование = "";
	КонецЕсли;

	Возврат Форматирование;

КонецФункции
&НаКлиенте
Функция УстановитьФорматирование(Знач ФорматируемаяСтрока, Знач Форматирование)

	Форматирование = СтрокаВМассив(Форматирование, ",");

	Кво = Форматирование.ВГраница();
	Для Инд = 0 По Кво Цикл
		Ф = Число(Форматирование[Инд]);
		Если Ф < 0 Тогда
			Сим = Символы.ПС;
			Ф = -Ф;
		Иначе
			Сим = Символы.Таб;
		КонецЕсли;

		ФорматируемаяСтрока = Лев(ФорматируемаяСтрока, Ф) + Сим + Сред(ФорматируемаяСтрока, Ф + 1);

	КонецЦикла;

	Возврат ФорматируемаяСтрока;

КонецФункции

&НаКлиенте
Процедура ВариантыЗаполненияДереваПриИзменении(Элемент)
	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыПередНачаломИзменения(Элемент, Отказ)
	ТД = Элемент.ТекущиеДанные;
	Колонка = Элемент.ТекущийЭлемент.Имя;

	Если Колонка <> "ПараметрыЗначение" Тогда
		Возврат;
	КонецЕсли;

	ИзменитьЗначениеПараметра(ТД);

	Отказ = Истина;

КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЗначениеПараметра(Знач ТД)

	Перем Парам, СписокДляВыбора, ТекЗначение;

	ТекЗначение = ТД.Значение;
	Если Не ПустаяСтрока(ТД.Форматирование) Тогда
		ТекЗначение = УстановитьФорматирование(ТекЗначение, ТД.Форматирование);
	КонецЕсли;

	СписокДляВыбора = Новый СписокЗначений;
	Для Каждого Парам Из Объект.Параметры Цикл
		СписокДляВыбора.Добавить(Парам.Наименование, Парам.Наименование + " = " + Парам.Значение);
	КонецЦикла;
	СписокДляВыбора.СортироватьПоЗначению();
	Парам = Новый Структура;
	Парам.Вставить("Заголовок", ТД.Наименование);
	Парам.Вставить("Выражение", ТекЗначение);
	Парам.Вставить("Варианты", ТД.Варианты);
	Парам.Вставить("СписокДляВыбора", СписокДляВыбора);
	Парам.Вставить("ЛеваяСкобкаПараметра", Объект.ЛеваяСкобкаПараметра);
	Парам.Вставить("ПраваяСкобкаПараметра", Объект.ПраваяСкобкапараметра);
	Парам.Вставить("ШаблонИмениПараметра", Объект.ШаблонИмениПараметра);

	ОткрытьФорму("Обработка.УИ_КонструкторРегулярныхВыражений.Форма.РедакторВыражения", Парам, ЭтотОбъект, , , ,
		Новый ОписаниеОповещения("ИзменитьЗначениеПараметраЗавершение", ЭтотОбъект, Новый Структура("ТД", ТД)),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура ИзменитьЗначениеПараметраЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТД=ДополнительныеПараметры.ТД;

	Выражение = Результат.Выражение;
	НовыеПараметры = Результат.НовыеПараметры;
	ДобавитьНовыеПараметрыИзСписка(НовыеПараметры);

	ТД.Форматирование = ИзвлечьФорматирование(Выражение);
	ТД.Значение = Выражение;
	ТД.Варианты = Результат.Варианты;
	СохраняемыеВНастройкахДанныеМодифицированы = Истина;

	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());

	Если Объект.Маска = ТД.Наименование Тогда
		Объект.Форматирование = ТД.Форматирование;
		Объект.Варианты = ТД.Варианты;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЛеваяСкобкаПараметраПриИзменении(Элемент)

	ПереименоватьПараметры();

КонецПроцедуры

&НаКлиенте
Процедура ПереименоватьПараметры()

	Перем ДЛС, ДПС, ДС, НовоеИмя, Парам, ПараметрыШаблона, СоответствиеИмен, СтароеИмя;

	СоответствиеИмен = Новый Соответствие;

	ДЛС = СтрДлина(ПередИзменениемЛеваяСкобкаПараметра);
	ДПС = СтрДлина(ПередИзменениемПраваяСкобкаПараметра);
	ДС = ДЛС + ДПС;

	ПараметрыШаблона = Объект.Параметры;
	Для Каждого Парам Из ПараметрыШаблона Цикл
		СтароеИмя = Парам.Наименование;
		НовоеИмя = Объект.ЛеваяСкобкаПараметра + Сред(СтароеИмя, ДЛС + 1, СтрДлина(СтароеИмя) - ДС)
			+ Объект.ПраваяСкобкаПараметра;

		СоответствиеИмен.Вставить(СтароеИмя, НовоеИмя);
	КонецЦикла;

	Для Каждого Парам Из ПараметрыШаблона Цикл
		Парам.Наименование = СоответствиеИмен.Получить(Парам.Наименование);

		Для Каждого Соотв Из СоответствиеИмен Цикл
			Парам.Значение = СтрЗаменить(Парам.Значение, Соотв.Ключ, Соотв.Значение);

			Если Не ПустаяСтрока(Парам.Варианты) Тогда
				Варианты = ЗначениеИзСтроки(Парам.Варианты);

				ЕстьОбновление = Ложь;
				Для Каждого Элем Из Варианты Цикл
					Структура = Элем.Значение;

					Обновление = СтрЗаменить(Структура.Выражение, Соотв.Ключ, Соотв.Значение);
					Если Структура.Выражение <> Обновление Тогда
						Структура.Выражение =  Обновление;
						Структура.Форматирование = "";
						ЕстьОбновление = Истина;
					КонецЕсли;
				КонецЦикла;

				Если ЕстьОбновление Тогда
					Парам.Варианты = ЗначениеВСтроку(Варианты);
				КонецЕсли;
			КонецЕсли;

		КонецЦикла;
	КонецЦикла;
	Для Каждого Соотв Из СоответствиеИмен Цикл
		Объект.Маска = СтрЗаменить(Объект.Маска, Соотв.Ключ, Соотв.Значение);
	КонецЦикла;

	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());
	ПередИзменениемЛеваяСкобкаПараметра = Объект.ЛеваяСкобкаПараметра;
	ПередИзменениемПраваяСкобкаПараметра = Объект.ПраваяСкобкаПараметра;

КонецПроцедуры

&НаКлиенте
Процедура ПраваяСкобкаПараметраПриИзменении(Элемент)

	ПереименоватьПараметры();

КонецПроцедуры

&НаКлиенте
Процедура ФорматированныйТекст(Команда)

	ФорматированныйТекст = Не ФорматированныйТекст;
	Элементы.ТекстКонтекстноеМенюфФорматированныйТекст.Пометка = ФорматированныйТекст;
	Элементы.ПредставлениеКонтекстноеМенюфФорматированныйТекст.Пометка = ФорматированныйТекст;

	УстановитьВидимость();

КонецПроцедуры

&НаКлиенте
Процедура фВосстанавливатьАвтоматически(Команда)

	ВосстанавливатьАвтоматически = Не ВосстанавливатьАвтоматически;
	Элементы.ПредставлениеКонтекстноеМенюфВосстанавливатьАвтоматически.Пометка = ВосстанавливатьАвтоматически;

КонецПроцедуры

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	ВариантыЗаполненияДерева = "Текущее выражение";

	УИ_ОбщегоНазначения.ФормаИнструментаПриСозданииНаСервере(ЭтотОбъект, Отказ, СтандартнаяОбработка);

КонецПроцедуры

&НаСервере
Процедура ПриЗагрузкеДанныхИзНастроекНаСервере(Настройки)

	Если ФорматированныйТекст Тогда
		Элементы.Представление.Видимость = Истина;
		Элементы.ПредставлениеДействия.Видимость = Истина;
		Элементы.Текст.Видимость = Ложь;
		Элементы.Раскраска.Видимость = Ложь;
	Иначе
		Элементы.Текст.Видимость = Истина;
		Элементы.Раскраска.Видимость = Истина;
		Элементы.Представление.Видимость = Ложь;
		Элементы.ПредставлениеДействия.Видимость = Ложь;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ЗаполнитьРаскраску()

	ТекРаскраска = "<pre style=""FONT-SIZE: 10pt; FONT-FAMILY: Courier New; color: #000000;"">";

	Код = "";
	Старт = Истина;
	Финиш = 0;
	НачПС = Символ(9650);
	КонПС = Символ(9660);

	Для Каждого Ф Из Фрагменты Цикл
		Если Старт Тогда
			Если Ф.Индекс <> 0 Тогда
				Код = Сред(Объект.Текст, 1, Ф.Индекс);
			КонецЕсли;
			Старт = Ложь;
		ИначеЕсли Финиш <> 0 Тогда
			Код = Код + Сред(Объект.Текст, Финиш, Ф.Индекс - Финиш + 1);
		КонецЕсли;
		
		//Код = Код + НачПС + СтрЗаменить(Сред(Объект.Текст, Ф.Индекс+1, Ф.Длина), Символы.ПС, КонПС+Символы.ПС+НачПС) + КонПС;
		Код = Код + НачальнаяМетка(Ф.ПП) + НачПС + СтрЗаменить(Сред(Объект.Текст, Ф.Индекс + 1, Ф.Длина), Символы.ПС,
			КонПС + Символы.ПС + НачПС) + КонПС + КонечнаяМетка(Ф.ПП);
		Финиш = Ф.Индекс + 1 + Ф.Длина;
	КонецЦикла;
	Код = Код + Сред(Объект.Текст, Финиш);
	Для Сч = 1 По СтрЧислоСтрок(Код) Цикл

		Рстр = СтрПолучитьСтроку(Код, Сч);

		RegExpLocal.Multiline = Ложь;
		RegExpLocal.Global = Истина;
		RegExpLocal.IgnoreCase = Истина;
		RegExpLocal.Pattern = "^(\t*).*$";

		Префикс = "";
		Результат = RegExpLocal.Execute (Рстр);
		Для Каждого Стр Из Результат Цикл
			Таб = Стр.SubMatches(0);

			Префикс = "<p";
			КвоТаб = СтрДлина(Таб);
			Если КвоТаб <> 0 Тогда
				Префикс = Префикс + " style=""MARGIN-LEFT: " + 20 * КвоТаб + "pt;"">";
				Рстр = Префикс + Сред(Рстр, КвоТаб + 1);
			Иначе
				Рстр = "<p>" + Сред(Рстр, КвоТаб + 1);
			КонецЕсли;
		КонецЦикла;

		ТекРаскраска = ТекРаскраска + Рстр + Символы.ПС;

	КонецЦикла;

	ТекРаскраска = СтрЗаменить(ТекРаскраска, НачПС, "<SPAN style=""COLOR: red"">");
	ТекРаскраска = СтрЗаменить(ТекРаскраска, КонПС, "</SPAN>");
	ТекРаскраска = "<HTML><HEAD><BODY>" + ТекРаскраска + "</BODY></HEAD></HTML>";

	РаскраскаИмяФайла = ПолучитьИмяВременногоФайла("html");
	Док = Новый ТекстовыйДокумент;
	Док.УстановитьТекст(ТекРаскраска);
	Док.Записать(РаскраскаИмяФайла);

	Раскраска = РаскраскаИмяФайла;

КонецПроцедуры

&НаКлиенте
Функция КонечнаяМетка(Знач НомерМетки)

	Возврат "<a name=""FEnd" + НомерМетки + """></a>";

КонецФункции

&НаКлиенте
Функция НачальнаяМетка(Знач НомерМетки)

	Возврат "<a name=""FBegin" + НомерМетки + """></a>";

КонецФункции
&НаКлиенте
Процедура МаскаОткрытие(Элемент, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	СписокДляВыбора = Новый СписокЗначений;
	Для Каждого Парам Из Объект.Параметры Цикл
		СписокДляВыбора.Добавить(Парам.Наименование, Парам.Наименование + " = " + Парам.Значение);
	КонецЦикла;
	СписокДляВыбора.СортироватьПоЗначению();

	ТекЗначение = Объект.Маска;

	Парам = Новый Структура;
	Парам.Вставить("Заголовок", "Выражение маски");
	Парам.Вставить("Выражение", ТекЗначение);
	Парам.Вставить("Варианты", "");
	Парам.Вставить("СписокДляВыбора", СписокДляВыбора);
	Парам.Вставить("ЛеваяСкобкаПараметра", Объект.ЛеваяСкобкаПараметра);
	Парам.Вставить("ПраваяСкобкаПараметра", Объект.ПраваяСкобкапараметра);
	Парам.Вставить("ШаблонИмениПараметра", Объект.ШаблонИмениПараметра);

	ОткрытьФорму("Обработка.УИ_КонструкторРегулярныхВыражений.Форма.РедакторВыражения", Парам, ЭтотОбъект, , , ,
		Новый ОписаниеОповещения("МаскаОткрытиеЗавершение", ЭтотОбъект),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры

&НаКлиенте
Процедура МаскаОткрытиеЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Выражение = Результат.Выражение;
	ИзвлечьФорматирование(Выражение);
	НовыеПараметры = Результат.НовыеПараметры;
	ДобавитьНовыеПараметрыИзСписка(НовыеПараметры);

	Объект.Маска = Выражение;

	ФорматированиеИВариантыМаски();

	СохраняемыеВНастройкахДанныеМодифицированы = Истина;
КонецПроцедуры
&НаКлиенте
Процедура ФорматированиеИВариантыМаски()

	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = "^" + ПолучитьШаблонПараметра() + "$";

	Если RegExpLocal.Test(Объект.Маска) Тогда
		Условие = Новый Структура("Наименование", Объект.Маска);
		СтрокаТЧ = Объект.Параметры.НайтиСтроки(Условие);

		Если СтрокаТЧ.Количество() <> 0 Тогда
			Парам = СтрокаТЧ[0];
			Объект.Форматирование = Парам.Форматирование;
			Объект.Варианты = Парам.Варианты;
		Иначе
			Объект.Форматирование = "";
			Объект.Варианты = "";
		КонецЕсли;
	Иначе
		Объект.Форматирование = "";
		Объект.Варианты = "";
	КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура ФрагментыВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;
	НайтиФрагментВРаскраске();

КонецПроцедуры

&НаКлиенте
Процедура НайтиФрагментВРаскраске()

	Перем Значение, Найдено, Стр, СтрокаЗамены, ТД, ТекФайл, ХТМЛ;

	Если Не Элементы.Раскраска.Видимость Тогда
		Возврат;
	КонецЕсли;
	
	//ТД = Элементы.Фрагменты.ТекущиеДанные;
	ТД = ТекущийЭлемент.ТекущиеДанные;
	Если ТД = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТекФайл = Новый ТекстовыйДокумент;
	ТекФайл.НачатьЧтение(Новый ОписаниеОповещения("НайтиФрагментВРаскраскеЗавершение", ЭтаФорма,
		Новый Структура("ТД, ТекФайл", ТД, ТекФайл)), РаскраскаИмяФайла);

КонецПроцедуры

&НаКлиенте
Процедура НайтиФрагментВРаскраскеЗавершение(Результат) Экспорт

	ТД = Результат.ТД;
	ТекФайл = Результат.ТекФайл;
	ХТМЛ = ТекФайл.ПолучитьТекст();

	RegExpLocal.Multiline = Истина;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;

	RegExpLocal.Pattern = "<SPAN style=""COLOR: green"">";
	СтрокаЗамены = "<SPAN style=""COLOR: red"">";
	ХТМЛ = RegExpLocal.Replace (ХТМЛ, СтрокаЗамены);
	RegExpLocal.Pattern = "(" + НачальнаяМетка(ТД.ПП) + "(?:.|\n)*?" + КонечнаяМетка(ТД.ПП) + ")";
	Найдено = RegExpLocal.Execute(ХТМЛ);
	Для Каждого Стр Из Найдено Цикл
		Значение = Стр.Value;
		Прервать;
	КонецЦикла;

	СтрокаЗамены = СтрЗаменить(Значение, "<SPAN style=""COLOR: red"">", "<SPAN style=""COLOR: green"">");
	ХТМЛ = СтрЗаменить(ХТМЛ, Значение, СтрокаЗамены);

	Элементы.Раскраска.Документ.body.innerHTML = ХТМЛ;

	ЭтаФорма.ТекущийЭлемент = Элементы.Раскраска;

	ТекФайл.УстановитьТекст(ХТМЛ);
	ТекФайл.НачатьЗапись(Новый ОписаниеОповещения("НайтиФрагментВРаскраскеЗавершениеЗаверешениеЗаписиФайла", ЭтотОбъект,
		Новый Структура("ТД", ТД)), РаскраскаИмяФайла);
КонецПроцедуры

&НаКлиенте
Процедура НайтиФрагментВРаскраскеЗавершениеЗаверешениеЗаписиФайла(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Истина Тогда
		ТД = ДополнительныеПараметры.ТД;
		Раскраска = РаскраскаИмяФайла + "#FBegin" + ТД.ПП;
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПереименоватьПараметр(Команда)

	ТД = Элементы.Параметры.ТекущиеДанные;

	ДЛС = СтрДлина(ПередИзменениемЛеваяСкобкаПараметра);
	ДПС = СтрДлина(ПередИзменениемПраваяСкобкаПараметра);
	ДС = ДЛС + ДПС;

	СтароеНаименование = ТД.Наименование;

	НовоеНаименование = Сред(СтароеНаименование, ДЛС + 1, СтрДлина(СтароеНаименование) - ДС);
	ПоказатьВводСтроки(Новый ОписаниеОповещения("ПереименоватьПараметрЗавершение", ЭтотОбъект,
		Новый Структура("ТекДанные", ТД)), НовоеНаименование, "Новое наименование?");
КонецПроцедуры

&НаКлиенте
Процедура ПереименоватьПараметрЗавершение(Строка, ДополнительныеПараметры) Экспорт
	Если Строка = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ТД=ДополнительныеПараметры.ТекДанные;
	СтароеНаименование = ТД.Наименование;

	ПараметрыШаблона = Объект.Параметры;

	НовоеНаименование = Объект.ЛеваяСкобкаПараметра + НормализоватьИмя(Строка) + Объект.ПраваяСкобкаПараметра;

	Условие = Новый Структура("Наименование", НовоеНаименование);
	СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
	Если СтрокаТЧ.Количество() <> 0 Тогда
		ПоказатьПредупреждение( , "Такое имя уже существует, - миссия не выполнима!");
		Возврат;
	КонецЕсли;

	ТД.Наименование = НовоеНаименование;
	Для Каждого Парам Из ПараметрыШаблона Цикл
		Парам.Значение = СтрЗаменить(Парам.Значение, СтароеНаименование, НовоеНаименование);

		Если Не ПустаяСтрока(Парам.Варианты) Тогда
			Варианты = ЗначениеИзСтроки(Парам.Варианты);

			ЕстьОбновление = Ложь;
			Для Каждого Элем Из Варианты Цикл
				Структура = Элем.Значение;

				Обновление = СтрЗаменить(Структура.Выражение, СтароеНаименование, НовоеНаименование);
				Если Структура.Выражение <> Обновление Тогда
					Структура.Выражение =  Обновление;
					Структура.Форматирование = "";
					ЕстьОбновление = Истина;
				КонецЕсли;
			КонецЦикла;

			Если ЕстьОбновление Тогда
				Парам.Варианты = ЗначениеВСтроку(Варианты);
			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	Объект.Маска = СтрЗаменить(Объект.Маска, СтароеНаименование, НовоеНаименование);
	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());

КонецПроцедуры

// Функция - Нормализовать имя параметра. Удаляются концевые пробелы, несколько последовательных пробелов заменяются одним
//
// Параметры:
//  Имя	 - Строка	 - имя параметра
// 
// Возвращаемое значение:
// Строка  - нормализованное имя параметра
//
&НаКлиенте
Функция НормализоватьИмя(Знач Имя)

	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Ложь;
	RegExpLocal.Pattern = "( +)";

	Имя = RegExpLocal.Replace (Имя, " ");

	Возврат СокрЛП(Имя);

КонецФункции
&НаКлиенте
Процедура фТолькоПросмотр(Команда)

	фТолькоПросмотрФрагмент();

КонецПроцедуры

&НаКлиенте
Процедура фТолькоПросмотрФрагмент()

	ТолькоПросмотрДереваПараметров = Не ТолькоПросмотрДереваПараметров;
	//Элементы.ДеревоПараметровКонтекстноеМенюфТолькоПросмотр.Пометка = ТолькоПросмотрДереваПараметров;

	Элементы.ДеревоПараметровЗамещать.ТолькоПросмотр = ТолькоПросмотрДереваПараметров;
	Элементы.ДеревоПараметровИзвлечь.ТолькоПросмотр = ТолькоПросмотрДереваПараметров;
	Элементы.ДеревоПараметровЗначение.ТолькоПросмотр = ТолькоПросмотрДереваПараметров;
	Если Не ТолькоПросмотрДереваПараметров Тогда
		ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());
	КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура ПараметрыПередНачаломДобавления(Элемент, Отказ, Копирование, Родитель, Группа, Параметр)

	Если Копирование Тогда
		ТД = Элементы.Параметры.ТекущиеДанные;
		ДЛС = СтрДлина(ПередИзменениемЛеваяСкобкаПараметра);
		ДПС = СтрДлина(ПередИзменениемПраваяСкобкаПараметра);
		ДС = ДЛС + ДПС;

		СтароеНаименование = ТД.Наименование;
		НовоеНаименованиеПриКопировании = Сред(СтароеНаименование, ДЛС + 1, СтрДлина(СтароеНаименование) - ДС);

		ПоказатьВводСтроки(Новый ОписаниеОповещения("ПараметрыПередНачаломДобавленияЗавершение", ЭтотОбъект,
			Новый Структура("ТекДанные, ТекСтрока", ТД, Элементы.Параметры.ТекущаяСтрока)),
			НовоеНаименованиеПриКопировании, "Новое наименование?");

	Иначе
		Отказ = Истина;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПараметрыПередНачаломДобавленияЗавершение(Строка, ДополнительныеПараметры) Экспорт
	ПараметрыШаблона = Объект.Параметры;
	НовоеНаименованиеПриКопировании = Объект.ЛеваяСкобкаПараметра + НормализоватьИмя(
			Строка) + Объект.ПраваяСкобкаПараметра;

	Условие = Новый Структура("Наименование", НовоеНаименованиеПриКопировании);
	СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
	Если СтрокаТЧ.Количество() <> 0 Тогда
		ПоказатьПредупреждение( , "Такое имя уже существует, - миссия не выполнима!");
		Объект.Параметры.Удалить(ДополнительныеПараметры.ТекСтрока);
	КонецЕсли;
КонецПроцедуры

&НаКлиенте
Процедура ПараметрыПриНачалеРедактирования(Элемент, НоваяСтрока, Копирование)

	Если Копирование Тогда
		ТД = Элементы.Параметры.ТекущиеДанные;
		ТД.Наименование = НовоеНаименованиеПриКопировании;
		ТД.Ссылка = Новый УникальныйИдентификатор;
	КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура ЗаполнитьВесьПроект(Команда)

	Код1С = "";

	Код1С = "//	Левая скобка параметра = " + Объект.ЛеваяСкобкаПараметра + "
																			  |//	Правая скобка параметра = "
		+ Объект.ПраваяСкобкаПараметра + "
										 |//	Шаблон имени = " + Объект.ШаблонИмениПараметра + "
																								 |//
																								 |";
	Для Каждого Парам Из Объект.Параметры Цикл
		Значение = Парам.Значение;
		Если Парам.Извлечь Тогда
			Если Лев(Значение, 3) = "(?:" И Прав(Значение, 1) = ")" Тогда
				Значение = "(" + Сред(Значение, 4);
			Иначе
				Значение = "(" + Значение + ")";
			КонецЕсли;
		КонецЕсли;

		Код1С = Код1С + "//" + Символы.Таб + ?(Парам.Замещать, "+", "-") + ?(Парам.Извлечь, "+", "-") + Символы.Таб
			+ Парам.Наименование + " = " + Значение + Символы.ПС;
	КонецЦикла;

КонецПроцедуры

&НаКлиенте
Процедура СохранитьВФайл(Команда)

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
	Диалог.Заголовок = "Сохранить проект в файл";
	Диалог.ПроверятьСуществованиеФайла = Истина;
	Диалог.ПредварительныйПросмотр = Ложь;
	Диалог.МножественныйВыбор = Ложь;
	Диалог.Фильтр = "Файлы Rep (*.rep)|*.rep";

	Диалог.Показать(Новый ОписаниеОповещения("СохранитьВФайлЗавершение", ЭтаФорма, Новый Структура("Диалог", Диалог)));
КонецПроцедуры

&НаКлиенте
Процедура СохранитьВФайлЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	Диалог = ДополнительныеПараметры.Диалог;
	Если (ВыбранныеФайлы <> Неопределено) Тогда

		Текст = Новый ТекстовыйДокумент;
		Текст.УстановитьТекст(Код1С);
		Текст.НачатьЗапись(,Диалог.ПолноеИмяФайла);

	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьИзФайла(Команда)

	Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
	Диалог.Заголовок = "Прочитать проект из файла";
	Диалог.ПроверятьСуществованиеФайла = Истина;
	Диалог.ПредварительныйПросмотр = Ложь;
	Диалог.МножественныйВыбор = Ложь;
	Диалог.Фильтр = "Файлы Rep (*.rep)|*.rep";

	Диалог.Показать(Новый ОписаниеОповещения("ПрочитатьИзФайлаЗавершение", ЭтаФорма, Новый Структура("Диалог", Диалог)));

КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьИзФайлаЗавершение(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт

	Диалог = ДополнительныеПараметры.Диалог;

	Если ВыбранныеФайлы = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ОглавлениеКниги = "";
	Текст = Новый ТекстовыйДокумент;
	Текст.НачатьЧтение(Новый ОписаниеОповещения("ПрочитатьИзФайлаЗавершениеЧтенияТекста", ЭтаФорма,
		Новый Структура("Текст", Текст)), Диалог.ПолноеИмяФайла);

КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьИзФайлаЗавершениеЧтенияТекста(Результат, ДополнительныеПараметры1) Экспорт

	Текст = ДополнительныеПараметры1.Текст;
	Код1С = Текст.ПолучитьТекст();

КонецПроцедуры

&НаКлиенте
Процедура МаскаПриИзменении(Элемент)

	ФорматированиеИВариантыМаски();
	СохраняемыеВНастройкахДанныеМодифицированы = Истина;

КонецПроцедуры
&НаКлиенте
Процедура ПерейтиВДерево(Команда)

	НужноОбновитьДерево = Ложь;
	Если ВариантыЗаполненияДерева <> "Текущее выражение" Тогда
		ВариантыЗаполненияДерева = "Текущее выражение";
		НужноОбновитьДерево = Истина;
	КонецЕсли;

	Если Не НужноОбновитьДерево Тогда
		Если Элементы.ДеревоПараметров.ТекущаяСтрока <> Неопределено Тогда
			СтрокаДерева = ДеревоПараметров.НайтиПоИдентификатору(Элементы.ДеревоПараметров.ТекущаяСтрока);
			Предок = ПолучитьПредка(СтрокаДерева);

			Если Предок.Наименование <> Объект.Маска Тогда
				НужноОбновитьДерево = Истина;
			КонецЕсли;
		Иначе
			НужноОбновитьДерево = Истина;
		КонецЕсли;
	КонецЕсли;

	Если НужноОбновитьДерево Тогда
		ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());
	КонецЕсли;

	ТекущийЭлемент = Элементы.ДеревоПараметров;

КонецПроцедуры
&НаКлиенте
Процедура ПерейтиВПараметры(Команда)

	ПараметрыШаблона = Объект.Параметры;
	Маска = Объект.Маска;
	Если Не ПустаяСтрока(Маска) Тогда
		Условие = Новый Структура("Наименование", Маска);
		СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);

		Если СтрокаТЧ.Количество() <> 0 Тогда
			Парам = СтрокаТЧ[0];
			Элементы.Параметры.ТекущаяСтрока = Парам.ПолучитьИдентификатор();
			Элементы.Страницы.ТекущаяСтраница = Элементы.ГруппаПараметры;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура ВключитьВПроект(Команда)
	
	//	Выражение = <Свойства параметров>
	//
	//	Левая скобка параметра = <
	//	Правая скобка параметра = >
	//	Шаблон имени = [А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?
	//
	//	+-	<Свойства параметров> = ^<Пусто>//\t<Имя свойства> = <Значение свойства>$
	//	++	<Значение свойства> = (.*?)
	//	++	<Имя свойства> = (<Шаблон имени параметра>)
	//	+-	<Пусто> = [ \t]*?
	//	+-	<Шаблон имени параметра> = [А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?
	idШаблонИмениПараметра = "[А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?";
	idЗначениеСвойства = "(.*?)";
	idИмяСвойства = "(" + idШаблонИмениПараметра + ")";
	idПусто = "[ \t]*?";
	idСвойстваПараметров = "^" + idПусто + "//\t" + idИмяСвойства + " = " + idЗначениеСвойства + "$";
	idPattern = idСвойстваПараметров;

	RegExpLocal.Multiline = Истина;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = idPattern;

	СвойстваПараметров = Новый Соответствие;
	Найдено = RegExpLocal.Execute(Код1С);
	Для Каждого Стр Из Найдено Цикл

		vidИмяСвойства = Стр.SubMatches(0);
		vidЗначениеСвойства = Стр.SubMatches(1);
		СвойстваПараметров.Вставить(vidИмяСвойства, vidЗначениеСвойства);

	КонецЦикла;	
	
	
	//	Выражение = <Импорт параметров>
	//
	//	Левая скобка параметра = <
	//	Правая скобка параметра = >
	//	Шаблон имени = [А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?
	//
	//	+-	<Импорт параметров> = ^<Пусто>//\t<Замещать><Извлечь>\t<ЛСП><Наименование><ПСК> = <Значение параметра>$
	//	+-	<ЛСП> = <
	//	++	<Наименование> = (<Шаблон имени параметра>)
	//	+-	<ПСК> = >
	//	+-	<Пусто> = [ \t]*?
	//	+-	<Шаблон имени параметра> = [А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?
	//	++	<Замещать> = (\+|-)
	//	++	<Значение параметра> = (.*?)
	//	++	<Извлечь> = (\+|-)
	idШаблонИмениПараметра = СвойстваПараметров.Получить("Шаблон имени");
	idЗначениеПараметра = "(.*?)";
	idПСК = СвойстваПараметров.Получить("Правая скобка параметра");
	idНаименование = "(" + idШаблонИмениПараметра + ")";
	idЛСП = СвойстваПараметров.Получить("Левая скобка параметра");
	idИзвлечь = "(\+|-)";
	idЗамещать = "(\+|-)";
	idПусто = "[ \t]*?";
	idИмпортПараметров = "^" + idПусто + "//\t" + idЗамещать + idИзвлечь + "\t" + idЛСП + idНаименование + idПСК
		+ " = " + idЗначениеПараметра + "$";
	idPattern = idИмпортПараметров;

	RegExpLocal.Multiline = Истина;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = idPattern;

	ПараметрыШаблона = Объект.Параметры;
	СписокПараметров = Новый СписокЗначений;

	Найдено = RegExpLocal.Execute(Код1С);
	Для Каждого Стр Из Найдено Цикл

		ТекПарам = Новый Структура;

		ТекПарам.Вставить("Замещать", ?(Стр.SubMatches(0) = "+", Истина, Ложь));
		ТекПарам.Вставить("Извлечь", ?(Стр.SubMatches(1) = "+", Истина, Ложь));
		ТекПарам.Вставить("Наименование", Объект.ЛеваяСкобкаПараметра + Стр.SubMatches(2)
			+ Объект.ПраваяСкобкаПараметра);

		НовоеЗначениеПараметра = Стр.SubMatches(3);
		УдалилСкобки = Ложь;
		Если Лев(НовоеЗначениеПараметра, 1) = "(" И Лев(НовоеЗначениеПараметра, 3) <> "(?:" И Прав(
			НовоеЗначениеПараметра, 1) = ")" Тогда
			НовоеЗначениеПараметра = Сред(НовоеЗначениеПараметра, 2, СтрДлина(НовоеЗначениеПараметра) - 2);
			УдалилСкобки = Истина;
		КонецЕсли;
		ТекПарам.Вставить("НовоеЗначениеПараметра", НовоеЗначениеПараметра);

		НовыйПараметр = КонтрольУникальностиПараметра(ТекПарам.Наименование);
		ТекПарам.Вставить("НовыйПараметр", НовыйПараметр);
		ТекПарам.Вставить("ПрежнееЗначениеПараметра", "");

		Если Не НовыйПараметр Тогда
			Условие = Новый Структура("Наименование", ТекПарам.Наименование);
			СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);
			ТекПарам.ПрежнееЗначениеПараметра = СтрокаТЧ[0].Значение;

			Если УдалилСкобки И Лев(ТекПарам.ПрежнееЗначениеПараметра, 3) = "(?:" И Прав(
				ТекПарам.ПрежнееЗначениеПараметра, 1) = ")" Тогда
				ТекПарам.НовоеЗначениеПараметра = "(?:" + ТекПарам.НовоеЗначениеПараметра + ")";
			КонецЕсли;

			Если ТекПарам.НовоеЗначениеПараметра = ТекПарам.ПрежнееЗначениеПараметра Тогда
				ТекПарам.Вставить("Действие", "Они равны. Пропустить.");
			Иначе
				//ТекПарам.Вставить("Действие", "Оставить прежнее значение.");
				ТекПарам.Вставить("Действие", "Сохранить новое значение.");
			КонецЕсли;
		Иначе
			ТекПарам.Вставить("Действие", "Сохранить новое значение.");
		КонецЕсли;

		СписокПараметров.Добавить(ТекПарам);
	КонецЦикла;

	Если СписокПараметров.Количество() = 0 Тогда
		Возврат;
	КонецЕсли;
	ОткрытьФорму("Обработка.УИ_КонструкторРегулярныхВыражений.Форма.ИмпортВыражений",
		Новый Структура("СписокПараметров", СписокПараметров), ЭтотОбъект, , , ,
		Новый ОписаниеОповещения("ВключитьВПроектЗавершение", ЭтотОбъект),
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);

КонецПроцедуры

&НаКлиенте
Процедура ВключитьВПроектЗавершение(Результат, ДополнительныеПараметры) Экспорт
	Если Результат = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПараметрыШаблона = Объект.Параметры;

	Для Каждого Парам Из Результат Цикл
		Структура = Парам.Значение;

		Если Структура.Действие = "Сохранить новое значение." Тогда
			Если Структура.НовыйПараметр Тогда
				КонтрольУникальностиПараметра(Структура.Наименование, "ВключитьВПроект");
				НовПарам = ПараметрыШаблона.Добавить();
				НовПарам.Наименование = Структура.Наименование;
				НовПарам.Значение = Структура.НовоеЗначениеПараметра;
				НовПарам.Замещать = Структура.Замещать;
				НовПарам.Извлечь = Структура.Извлечь;
				НовПарам.Ссылка = Новый УникальныйИдентификатор;

			Иначе

				Условие = Новый Структура("Наименование", Структура.Наименование);
				СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);

				СтрокаТЧ[0].Варианты = СохранитьВариант(СтрокаТЧ[0].Варианты, СтрокаТЧ[0].Значение);
				СтрокаТЧ[0].Значение = Структура.НовоеЗначениеПараметра;

			КонецЕсли;
		КонецЕсли;
	КонецЦикла;

	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());
	СохраняемыеВНастройкахДанныеМодифицированы = Истина;

КонецПроцедуры

&НаСервереБезКонтекста
Функция СохранитьВариант(Знач Варианты, Значение)

	Если ПустаяСтрока(Значение) Тогда
		Возврат Варианты;
	КонецЕсли;
	Если Не ПустаяСтрока(Варианты) Тогда
		Варианты = ЗначениеИзСтрокиВнутр(Варианты);
	Иначе
		Варианты = Новый СписокЗначений;
	КонецЕсли;

	ТекФорматирование = "";
	ТекВыражение = Значение;

	ТакогоНет = Истина;
	Для Каждого Элем Из Варианты Цикл
		Структура = Элем.Значение;
		Если Структура.Выражение = ТекВыражение Тогда
			ТакогоНет = Ложь;
			Прервать;
		КонецЕсли;
	КонецЦикла;

	Если ТакогоНет Тогда
		Структура = Новый Структура("Выражение,Форматирование,Комментарий", ТекВыражение, ТекФорматирование,
			ТекущаяДата());
		Элем = Варианты.Добавить(Структура, ТекущаяДата(), Ложь, БиблиотекаКартинок.Форма);
	КонецЕсли;

	Возврат ЗначениеВСтрокуВнутр(Варианты);

КонецФункции
&НаКлиенте
Процедура ВыполнитьТестирование(Команда)

	Если ПустаяСтрока(Объект.Маска) Тогда
		Возврат;
	КонецЕсли;

	Объект.Маска = ТекущийЭлемент.ТекущиеДанные.Наименование;
	УстановитьТекст();
	ТестФрагмент();

КонецПроцедуры

&НаКлиенте
Процедура ВыполнитьПоиск(Команда)

	Если ТекущийЭлемент <> Элементы.ВыполнитьПоиск Тогда
		Объект.Маска = ТекущийЭлемент.ТекущиеДанные.Наименование;
	КонецЕсли;

	Если ПустаяСтрока(Объект.Маска) Тогда
		Возврат;
	КонецЕсли;

	УстановитьТекст();
	ПоискВыраженийФрагмент();

КонецПроцедуры
&НаКлиенте
Процедура УстановитьТекст()

	ПараметрыШаблона = Объект.Параметры;

	Условие = Новый Структура("Наименование", Объект.Маска);
	СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);

	Если СтрокаТЧ.Количество() <> 0 Тогда
		Парам = СтрокаТЧ[0];
		Если Не ПустаяСтрока(Парам.Тест) Тогда
			Объект.Текст = Парам.Тест;
		КонецЕсли;
	КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура ИзменитьЗначениеМаски(Команда)

	Маска = Объект.Маска;
	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = "^" + ПолучитьШаблонПараметра() + "$";

	Если Не RegExpLocal.Test(Маска) Тогда
		Возврат;
	КонецЕсли;

	ПараметрыШаблона = Объект.Параметры;
	Если Не ПустаяСтрока(Маска) Тогда
		Условие = Новый Структура("Наименование", Маска);
		СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);

		Если СтрокаТЧ.Количество() = 0 Тогда

			КонтрольУникальностиПараметра(Маска, "ИзменитьЗначениеМаски");
			ТД = ПараметрыШаблона.Добавить();
			ТД.Наименование = Маска;
			ТД.Ссылка = Новый УникальныйИдентификатор;
			ТД.Замещать = Истина;

		Иначе
			ТД = СтрокаТЧ[0];
		КонецЕсли;
	КонецЕсли;

	ИзменитьЗначениеПараметра(ТД);

КонецПроцедуры
&НаКлиенте
Процедура ПоказатьРезультат(Команда)

	СписокДляВыбора = Новый СписокЗначений;
	Парам = Новый Структура("Заголовок,Выражение,СписокДляВыбора,ЛеваяСкобкаПараметра,ПраваяСкобкапараметра,ШаблонИмениПараметра,ТолькоПросмотр",
		"Имеем в результате такое выражение:", Объект.МаскаРезультата, СписокДляВыбора, Объект.ЛеваяСкобкаПараметра,
		Объект.ПраваяСкобкапараметра, Объект.ШаблонИмениПараметра, Истина);

	ОткрытьФорму("Обработка.УИ_КонструкторРегулярныхВыражений.Форма.РедакторВыражения", Парам, ЭтаФорма, , , , ,
		РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
&НаКлиенте
Процедура ПометитьНаУдаление(Команда)

	ТД = Элементы.Параметры.ТекущиеДанные;
	Наименование = ТД.Наименование;

	УдалятьНельзя = Ложь;
	ПараметрыШаблона = Объект.Параметры;
	Для Каждого Парам Из ПараметрыШаблона Цикл
		Если СтрНайти(Парам.Значение, Наименование) <> 0 Тогда
			УдалятьНельзя = Истина;
		КонецЕсли;
	КонецЦикла;

	Если УдалятьНельзя Тогда
		ПоказатьПредупреждение( , "Не может быть удален. Где-то используется...");
		Возврат;
	КонецЕсли;

	ТД.Значение = "";
	ТД.Замещать = Ложь;
	ТД.Удалить = Не ТД.Удалить;

КонецПроцедуры
&НаКлиенте
Процедура ПрисвоитьИмяЗначению(Команда)

	Перем ВремИмяТэга, Значение;
	ТД = Элементы.Уникальные.ТекущиеДанные;
	Если ТД = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ВыделенныйТекст = ТД.Значение;
	Если ПустаяСтрока(ВыделенныйТекст) Тогда
		Возврат;
	КонецЕсли;

	ИмяТэга = "";
	ПоказатьВводСтроки(Новый ОписаниеОповещения("ПрисвоитьИмяЗначениюЗавершение", ЭтаФорма, Новый Структура("ИмяТэга",
		ИмяТэга)), ИмяТэга, ВыделенныйТекст + " - имя?", 0);

КонецПроцедуры

&НаКлиенте
Процедура ПрисвоитьИмяЗначениюЗавершение(Строка, ДополнительныеПараметры) Экспорт

	ИмяТэга = ?(Строка = Неопределено, ДополнительныеПараметры.ИмяТэга, Строка);
	Если Не (Строка <> Неопределено) Тогда
		Возврат;
	КонецЕсли;
	ИмяТэга = НормализоватьИмя(ИмяТэга);
	
	
	//	Выражение = <Перечисление>
	//
	//	Левая скобка параметра = <
	//	Правая скобка параметра = >
	//	Шаблон имени = [А-ЯA-Z][-_ А-Яа-я0-9A-Za-z]*?
	//
	//	+-	<Перечисление> = (?:^\(\?\:<СписокЗначенийПеречисления>\)$)|(?:^<СписокЗначенийПеречисления>$)
	//	++	<СписокЗначенийПеречисления> = (<ЗначениеПеречисления>(?:\|<ЗначениеПеречисления>)*)
	//	+-	<ЗначениеПеречисления> = [^|\r\n]*
	idЗначениеПеречисления = "[^|\r\n]*";
	idСписокЗначенийПеречисления = "(" + idЗначениеПеречисления + "(?:\|" + idЗначениеПеречисления + ")*)";
	idПеречисление = "(?:^\(\?\:" + idСписокЗначенийПеречисления + "\)$)|(?:^" + idСписокЗначенийПеречисления + "$)";
	idPattern = idПеречисление;

	RegExpLocal.Multiline = Ложь;
	RegExpLocal.Global = Истина;
	RegExpLocal.IgnoreCase = Истина;
	RegExpLocal.Pattern = idPattern;
	НовыйТэг =Истина;
	Значение = "";
	ПолноеИмяТэга = Объект.ЛеваяСкобкаПараметра + ИмяТэга + Объект.ПраваяСкобкаПараметра;
	Для Каждого Парам Из Объект.Параметры Цикл
		Если ВРег(ПолноеИмяТэга) = ВРег(Парам.Наименование) Тогда

			Значение = Парам.Значение;
			ВключитьВСостав = RegExpLocal.Test(Значение);

			Если ВключитьВСостав Тогда
				ПоказатьВопрос(Новый ОписаниеОповещения("ПрисвоитьИмяЗначениюЗавершениеЗавершение", ЭтаФорма,
					Новый Структура("Значение, ПолноеИмяТэга", Значение, ПолноеИмяТэга)),
					"Такое имя существует. Включить в состав?", РежимДиалогаВопрос.ДаНет);
				Возврат;
				Прервать;
			Иначе
				ПоказатьПредупреждение( , "Такое имя уже существует.Миссия невозможна.");
				Возврат;
			КонецЕсли;

		КонецЕсли;
	КонецЦикла;
	ПрисвоитьИмяЗначениюЗавершениеФрагмент(Значение, НовыйТэг, ПолноеИмяТэга);
КонецПроцедуры

&НаКлиенте
Процедура ПрисвоитьИмяЗначениюЗавершениеЗавершение(РезультатВопроса, ДополнительныеПараметры1) Экспорт

	Значение = ДополнительныеПараметры1.Значение;
	ПолноеИмяТэга = ДополнительныеПараметры1.ПолноеИмяТэга;
	Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;

	НовыйТэг = Ложь;

	ПрисвоитьИмяЗначениюЗавершениеФрагмент(Значение, НовыйТэг, ПолноеИмяТэга);

КонецПроцедуры

&НаКлиенте
Процедура ПрисвоитьИмяЗначениюЗавершениеФрагмент(Значение, Знач НовыйТэг, Знач ПолноеИмяТэга)

	Перем vidСписокЗначенийПеречисления, ВсеЗначения, ВыделенныеСтроки, ЗаключитьВСкобки, Инд, Найдено, Парам, Стр, ТекЗн, Элем;

	ЗаключитьВСкобки = Ложь;
	ВсеЗначения = Новый Массив;
	Если Не НовыйТэг Тогда
		Найдено = RegExpLocal.Execute(Значение);
		Для Каждого Стр Из Найдено Цикл

			vidСписокЗначенийПеречисления = Стр.SubMatches(0);
			ЗаключитьВСкобки = Истина;
			Если ПустаяСтрока(vidСписокЗначенийПеречисления) Тогда
				vidСписокЗначенийПеречисления = Стр.SubMatches(1);
				ЗаключитьВСкобки = Ложь;
			КонецЕсли;

			ТекЗн = СтрокаВМассив(vidСписокЗначенийПеречисления, "|");
			Для Инд = 0 По ТекЗн.ВГраница() Цикл
				ДобавитьВМассивБезПовторений(ВсеЗначения, ТекЗн[Инд]);
			КонецЦикла;
		КонецЦикла;
	КонецЕсли;
	ВыделенныеСтроки = Элементы.Уникальные.ВыделенныеСтроки;
	Для Инд = 0 По ВыделенныеСтроки.ВГраница() Цикл
		Элем = Уникальные.НайтиПоИдентификатору(ВыделенныеСтроки[Инд]);
		ДобавитьВМассивБезПовторений(ВсеЗначения, Элем.Значение);
	КонецЦикла;
	Значение = "";
	Для Инд = 0 По ВсеЗначения.ВГраница() Цикл
		Если Не ПустаяСтрока(Значение) Тогда
			Значение = Значение + "|";
		КонецЕсли;
		Значение = Значение + ВсеЗначения[Инд];
	КонецЦикла;

	Если ЗаключитьВСкобки Тогда
		Значение = "(?:" + Значение + ")";
	КонецЕсли;

	Если НовыйТэг Тогда
		КонтрольУникальностиПараметра(ПолноеИмяТэга, "ПрисвоитьИмяЗначению");
		Парам = Объект.Параметры.Добавить();
		Парам.Наименование = ПолноеИмяТэга;
		Парам.Замещать = Истина;
		Парам.Ссылка = Новый УникальныйИдентификатор;
	КонецЕсли;
	Парам.Значение = Значение;

	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());

КонецПроцедуры
&НаКлиенте
Процедура Группа13ПриСменеСтраницы(Элемент, ТекущаяСтраница)

	Если ТекущаяСтраница = Элементы.ГруппаУникальные Тогда
		Если Уникальные.Количество() = 0 Тогда
			ВКакихФрагментахСсылки.Очистить();

			НомерПодстроки = -1;
			ИмяУникальные = "";
			Для Каждого Стр Из Фрагменты Цикл
				Если Не ПустаяСтрока(Стр.Представление) Тогда
					Элем = ДобавитьВСписокБезПовторений(Уникальные, Стр.Представление);
					ДобавитьВКакихФрагментахСсылки(Стр, Элем);
				КонецЕсли;
			КонецЦикла;
			Уникальные.СортироватьПоЗначению();

		КонецЕсли;
	КонецЕсли;

КонецПроцедуры

&НаКлиенте
Процедура НомерПодстрокиПриИзменении(Элемент)

	Уникальные.Очистить();
	ВКакихФрагментахСсылки.Очистить();
	ВКакихФрагментах.Очистить();
	Если Фрагменты.Количество() = 0 Тогда
		НомерПодстроки = -1;
		ИмяУникальные = "";
		Возврат;
	КонецЕсли;

	НомерПодстроки = Мин(НомерПодстроки, Фрагменты[0].Подстрока.Количество() - 1);

	Если НомерПодстроки = -1 Тогда
		ИмяУникальные = "";
		Для Каждого Стр Из Фрагменты Цикл
			Если Не ПустаяСтрока(Стр.Представление) Тогда
				Элем = ДобавитьВСписокБезПовторений(Уникальные, Стр.Представление);
				ДобавитьВКакихФрагментахСсылки(Стр, Элем);
			КонецЕсли;
		КонецЦикла;
	Иначе

		ТД = Элементы.Фрагменты.ТекущиеДанные;
		Если ТД <> Неопределено Тогда
			Кво = ТД.ПодСтрока.Количество();
			Если Кво <> 0 И Кво <> Порядок.Количество() Тогда
				ИмяУникальные = "???";
			Иначе
				ИмяУникальные = Порядок[НомерПодстроки];
			КонецЕсли;
		Иначе
			ИмяУникальные = "";
		КонецЕсли;

		Для Каждого Стр Из Фрагменты Цикл
			Значение = Стр.Подстрока[НомерПодстроки].Значение;
			Если Не ПустаяСтрока(Значение) Тогда
				Элем = ДобавитьВСписокБезПовторений(Уникальные, Значение);
				ДобавитьВКакихФрагментахСсылки(Стр, Элем);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;

	Уникальные.СортироватьПоЗначению();

КонецПроцедуры

&НаКлиенте
Процедура ФрагментыПодСтрокаВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)

	ТД = Элементы.ФрагментыПодСтрока.ТекущиеДанные;

	Текст = Новый ТекстовыйДокумент;
	Текст.УстановитьТекст(ТД.Значение);
	Текст.Показать();

КонецПроцедуры

&НаКлиенте
Процедура ВсеРазвернуть(Команда)

	ТолькоПросмотрДереваПараметров = Ложь;
	фТолькоПросмотрФрагмент();

	ПерваяСтрока = Неопределено;
	СтрокиДерева = ДеревоПараметров.ПолучитьЭлементы();
	Для Каждого Стр Из СтрокиДерева Цикл
		ТекущаяСтрока = Стр.ПолучитьИдентификатор();
		Если ПерваяСтрока = Неопределено Тогда
			ПерваяСтрока = ТекущаяСтрока;
		КонецЕсли;

		ВключитьПодчиненные(Стр, Истина);
		Элементы.ДеревоПараметров.Развернуть(ТекущаяСтрока, Истина);
	КонецЦикла;

	Элементы.ДеревоПараметров.ТекущаяСтрока = ПерваяСтрока;

КонецПроцедуры

&НаКлиенте
Процедура ВсеСвернуть(Команда)

	ТолькоПросмотрДереваПараметров = Истина;
	фТолькоПросмотрФрагмент();

КонецПроцедуры
&НаКлиенте
Функция ПолучитьПорядокИзвлеченныхЗначений()

	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора(Ложь, "Текущее выражение"), Истина);

	ПерваяСтрока = Неопределено;
	СтрокиДерева = ДеревоПорядка.ПолучитьЭлементы();
	Для Каждого Стр Из СтрокиДерева Цикл
		ТекущаяСтрока = Стр.ПолучитьИдентификатор();
		Если ПерваяСтрока = Неопределено Тогда
			ПерваяСтрока = ТекущаяСтрока;
		КонецЕсли;

		ВключитьПодчиненные(Стр, Истина);
	КонецЦикла;

	Порядок.Очистить();
	ОпределитьПорядокРекурсивно(ДеревоПорядка.ПолучитьЭлементы(), Порядок);

	Возврат Порядок;

КонецФункции
&НаКлиенте
Процедура ОпределитьПорядокРекурсивно(Знач Строки, Порядок)

	Для Каждого Стр Из Строки Цикл
		Если Стр.Извлечь Тогда
			Порядок.Добавить(ПреобразоватьИмяПараметраВИдентификатор(Стр.Наименование), Стр.Наименование);
		КонецЕсли;
		ОпределитьПорядокРекурсивно(Стр.ПолучитьЭлементы(), Порядок);
	КонецЦикла;

КонецПроцедуры
&НаКлиенте
Процедура ФрагментыПодСтрокаПриАктивизацииСтроки(Элемент)

	ТД = Элементы.Фрагменты.ТекущиеДанные;
	Если ТД = Неопределено Тогда
		ИмяПодстроки = "";
		Возврат;
	КонецЕсли;
	Кво = ТД.ПодСтрока.Количество();
	Если Кво <> 0 Тогда
		ФрагментыПодСтрока = ТД.Подстрока;
		Элем = ФрагментыПодСтрока.НайтиПоИдентификатору(Элементы.ФрагментыПодстрока.ТекущаяСтрока);
		Инд = ФрагментыПодСтрока.Индекс(Элем);
		Если Порядок.Количество() = Кво Тогда
			ИмяПодстроки = Порядок[Инд].Представление;
		Иначе
			ИмяПодстроки = "???";
		КонецЕсли;
		
		//ИндексФрагментыПодстрока = Инд;
	Иначе
		ИмяПодстроки = "";
		//ИндексФрагментыПодстрока = 0;
	КонецЕсли;

КонецПроцедуры


//&НаКлиенте
//Процедура ФрагментыПриАктивизацииСтроки(Элемент)

//	Если ИндексФрагментыПодстрока <> 0  Тогда
//		ПодключитьОбработчикОжидания("УстановитьСтрокуВФрагментыПодстрока", 0.1, Истина);
//	КонецЕсли;
//	
//КонецПроцедуры



//&НаКлиенте
//Процедура УстановитьСтрокуВФрагментыПодстрока()
//	
//	ТД = Элементы.Фрагменты.ТекущиеДанные;
//	Если ТД = Неопределено Тогда
//		Возврат;
//	КонецЕсли;
//	
//	Подстрока = ТД.Подстрока;
//	ИндексФрагментыПодстрока = Мин(ИндексФрагментыПодстрока, Подстрока.Количество()-1);
//	Если ИндексФрагментыПодстрока < 0  Тогда
//		Возврат;
//	КонецЕсли;
//	
//	Элементы.ФрагментыПодСтрока.ТекущаяСтрока = Подстрока[ИндексФрагментыПодстрока].ПолучитьИдентификатор();
//	
//КонецПроцедуры
&НаКлиенте
Процедура ДобавитьВКакихФрагментахСсылки(Знач Стр, Знач Элем)

	Значение = ВКакихФрагментахСсылки.Получить(Элем);
	Если Значение = Неопределено Тогда
		Значение = Новый СписокЗначений;
		ВКакихФрагментахСсылки.Вставить(Элем, Значение);
	КонецЕсли;
	Значение.Добавить(Стр);

КонецПроцедуры
&НаКлиенте
Процедура УникальныеПриАктивизацииСтроки(Элемент)

	ТС = Элементы.Уникальные.ТекущаяСтрока;
	Если ТС = Неопределено Тогда
		Возврат;
	КонецЕсли;
	Элем = Уникальные.НайтиПоИдентификатору(ТС);
	//Индекс = Уникальные.Индекс(Элем);
	ВКакихФрагментах.Очистить();

	СписокФрагментов = ВКакихФрагментахСсылки.Получить(Элем);
	Если СписокФрагментов <> Неопределено Тогда
		Для Каждого Ссылка Из СписокФрагментов Цикл
			Стр = Ссылка.Значение;

			Элем = ВКакихФрагментах.Добавить();
			Элем.ПП = Стр.ПП;
			Элем.Индекс = Стр.Индекс;
			Элем.Длина = Стр.Длина;
			Элем.Значение = Стр.Значение;
			Элем.Представление = Стр.Представление;
		КонецЦикла;
	КонецЕсли;

КонецПроцедуры
&НаКлиенте
Процедура ВКакихФрагментахВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	СтандартнаяОбработка = Ложь;

	НайтиФрагментВРаскраске();

КонецПроцедуры
&НаКлиенте
Функция КонтрольУникальностиПараметра(Наименование, Метка = "")

	ПараметрыШаблона = Объект.Параметры;
	НовыйПараметр = Истина;

	Условие = Новый Структура("Наименование", Наименование);
	СтрокаТЧ = ПараметрыШаблона.НайтиСтроки(Условие);

	Если СтрокаТЧ.Количество() <> 0 Тогда
		НовыйПараметр = Ложь;
		Если Не ПустаяСтрока(Метка) Тогда
			ПоказатьПредупреждение( , Метка + ": продублирован параметр с именем - " + Наименование);
		КонецЕсли;
	КонецЕсли;

	Возврат НовыйПараметр;

КонецФункции

&НаКлиенте
Процедура УдалитьВсеПараметры(Команда)

	ПоказатьВопрос(Новый ОписаниеОповещения("УдалитьВсеПараметрыЗавершение", ЭтаФорма),
		"Все параметры будут удалены. Выполнить?", РежимДиалогаВопрос.ДаНет);

КонецПроцедуры

&НаКлиенте
Процедура УдалитьВсеПараметрыЗавершение(РезультатВопроса, ДополнительныеПараметры) Экспорт

	Если РезультатВопроса = КодВозвратаДиалога.Нет Тогда
		Возврат;
	КонецЕсли;

	Объект.Параметры.Очистить();
	Объект.Маска = "";
	ОбновитьДеревоНаКлиенте(ПолучитьСписокВыбора());

КонецПроцедуры

&НаКлиенте
Процедура ЗакрытьОбработку(Команда)

	Закрыть();

КонецПроцедуры

//@skip-warning
&НаКлиенте
Процедура Подключаемый_ВыполнитьОбщуюКомандуИнструментов(Команда) 
	УИ_ОбщегоНазначенияКлиент.Подключаемый_ВыполнитьОбщуюКомандуИнструментов(ЭтотОбъект, Команда);
КонецПроцедуры

